diff options
Diffstat (limited to 'gnu/usr.bin/texinfo')
99 files changed, 48917 insertions, 788 deletions
diff --git a/gnu/usr.bin/texinfo/ABOUT-NLS b/gnu/usr.bin/texinfo/ABOUT-NLS new file mode 100644 index 00000000000..75f8a27fda1 --- /dev/null +++ b/gnu/usr.bin/texinfo/ABOUT-NLS @@ -0,0 +1,226 @@ +Notes on the GNU Translation Project +************************************ + + GNU is going international! The GNU Translation Project is a way to +get maintainers, translators, and users all together, so that GNU will +gradually become able to speak many languages. A few packages already +provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a GNU distribution, you +may assume that the distributed package does use GNU `gettext' +internally, itself available at your nearest GNU archive site. But you +do *not* need to install GNU `gettext' prior to configuring, installing +or using this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +One advise in advance +===================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in +the operating system where this package is being installed. So far, no +prior implementation provides as many useful features (such as locale +alias or message inheritance). It is also not possible to offer this +additional functionality on top of a `catgets' implementation. Future +versions of GNU `gettext' will very likely convey even more +functionality. So it might be a good idea to change to GNU `gettext' +as soon as possible. + +INSTALL Matters +=============== + + Some GNU packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system provides +usable `catgets' (if using this is selected by the installer) or +`gettext' functions. If neither is available, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is *not* required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --with-catgets + ./configure --disable-nls + +will respectively bypass any pre-existing `catgets' or `gettext' to use +the internationalizing routines provided within this package, enable +the use of the `catgets' functions (if found on the locale system), or +else, *totally* disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + By default the configuration process will not test for the `catgets' +function and therefore they will not be used. The reasons are already +given above: the emulation on top of `catgets' cannot provide all the +extensions provided by the GNU `gettext' library. If you nevertheless +want to use the `catgets' functions use + + ./configure --with-catgets + +to enable the test for `catgets' (this causes no harm if `catgets' is +not available on your system). If you really select this option we +would like to hear about the reasons because we cannot think of any +good one ourself. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +ISO 639 `LL' two-letter code prior to using the programs in the +package. For example, let's suppose that you speak German. At the +shell prompt, merely execute `setenv LANG de' (in `csh'), +`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This +can be done from your `.login' or `.profile' file, once and for all. + + An operating system might already offer message localization for +many of its programs, while other programs (whether GNU or not) have +been installed locally with the full capabilities of GNU `gettext'. +Just using `gettext' extended syntax for `LANG' would break proper +localization of already available operating system programs. In this +case, users should set both `LANGUAGE' and `LANG' variables in their +environment, as programs using GNU `gettext' give preference to +`LANGUAGE'. For example, some Swedish users would rather read +translations in German than English for when Swedish is not available. +This is easily accomplished by setting `LANGUAGE' to `sv:de' while +leaving `LANG' to `sv'. + +Translating Teams +================= + + For the GNU Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list, courtesy of Linux +International. You may reach your translation team at the address +`LL@li.org', replacing LL by the two-letter ISO 639 code for your +language. Language codes are *not* the same as the country codes given +in ISO 3166. The following translation teams exist, as of February +1997: + + Arabic `ar', Chinese `zh', Czech `cs', Danish `da', Dutch `nl', + English `en', Esperanto `eo', Finnish `fi', French `fr', German + `de', Greek `el', Hebrew `he', Hungarian `hu', Irish `ga', Italian + `it', Indonesian `id', Japanese `ja', Korean `ko', Latin `la', + Norwegian `no', Persian `fa', Polish `pl', Portuguese `pt', + Russian `ru', Slovenian `sl', Spanish `es', Swedish `sv', Telugu + `te', Turkish `tr' and Ukrainian `uk'. + +For example, you may reach the Chinese translation team by writing to +`zh@li.org'. + + If you'd like to volunteer to *work* at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is *not* the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +*actively* in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `gnu-translation@gnu.ai.mit.edu' to reach +the GNU coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology used in GNU. Proven linguistic skill are praised more +than programming skill, here. For the time being, please avoid +subscribing to the English team unless explicitly invited to do so. + +Available Packages +================== + + Languages are not equally supported in all GNU packages. The +following matrix shows the current state of GNU internationalization, +as of February 1997. The matrix shows, in regard of each package, for +which languages PO files have been submitted to translation +coordination. + + Ready PO files cs de en es fi fr ja ko nl no pl pt sl sv + .-------------------------------------------. + bash | [] [] [] | 3 + bison | [] [] [] | 3 + clisp | [] [] [] | 3 + cpio | [] [] [] [] [] | 5 + diffutils | [] [] [] [] | 4 + enscript | [] [] [] [] [] | 5 + fileutils | [] [] [] [] [] [] [] [] | 8 + findutils | [] [] [] [] [] [] [] | 7 + flex | [] [] [] | 3 + gcal | [] [] [] | 3 + gettext | [] [] [] [] [] [] [] [] [] [] | 11 + grep | [] [] [] [] [] [] [] [] | 8 + hello | [] [] [] [] [] [] [] [] [] [] | 10 + id-utils | [] [] | 2 + indent | [] [] | 2 + libc | [] [] [] [] [] [] [] | 7 + m4 | [] [] [] [] [] | 5 + make | [] [] [] [] [] [] | 6 + music | [] | 1 + ptx | [] [] [] [] [] [] [] [] | 8 + recode | [] [] [] [] [] [] [] [] | 8 + sh-utils | [] [] [] [] [] | 5 + sharutils | [] [] [] [] [] | 5 + tar | [] [] [] [] [] [] [] [] [] | 9 + texinfo | | 0 + textutils | [] [] [] [] [] [] | 6 + wdiff | [] [] [] [] [] [] [] [] | 8 + `-------------------------------------------' + 14 languages cs de en es fi fr ja ko nl no pl pt sl sv + 27 packages 1 22 1 14 1 25 1 10 20 7 14 7 7 15 145 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +GNU distribution. + + If February 1997 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. + diff --git a/gnu/usr.bin/texinfo/AUTHORS b/gnu/usr.bin/texinfo/AUTHORS new file mode 100644 index 00000000000..647ea29772d --- /dev/null +++ b/gnu/usr.bin/texinfo/AUTHORS @@ -0,0 +1,3 @@ +Richard Stallman, Brian Fox, Bob Chassell, Noah Friedman, Paul Rubin, +Karl Berry, and no doubt many others. + diff --git a/gnu/usr.bin/texinfo/COPYING b/gnu/usr.bin/texinfo/COPYING index 916d1f0f284..a43ea2126fb 100644 --- a/gnu/usr.bin/texinfo/COPYING +++ b/gnu/usr.bin/texinfo/COPYING @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found. 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 + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. diff --git a/gnu/usr.bin/texinfo/ChangeLog b/gnu/usr.bin/texinfo/ChangeLog index 06d0464a688..fbaaa9e37b6 100644 --- a/gnu/usr.bin/texinfo/ChangeLog +++ b/gnu/usr.bin/texinfo/ChangeLog @@ -1,3 +1,895 @@ +Thu Jul 31 11:57:46 1997 Karl Berry <karl@cs.umb.edu> + + * Version 3.11. + + * info/man.c (reap_children): Declare status as int, not unsigned, + since that's what POSIX says the arg to wait should be. + + * makeinfo/makeinfo.c (cm_uref, cm_email): Rewrite to do macro + expansion in the arguments. + + * makeinfo/makeinfo.c (main): setlocale LC_MESSAGES and LC_TIME, + instead of LC_ALL. + From: Akim Demaille <demaille@inf.enst.fr>. + + * makeinfo/makeinfo.c (cm_today): Let the %d %s %d be translated, + so other languages can change the order of day/month/year. + From: Akim Demaille <demaille@inf.enst.fr>. + + * info/infomap.c: Doc fix. + + * lib/system.h [!O_RDONLY]: Prefer <fcntl.h> to <sys/fcntl.h>. + + * configure.in (AC_CHECK_HEADERS): Check for fcntl.h. + + * doc/Makefile.am (install-data-local): Suggest tex/generic/dvips + for epsf.tex. + From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>. + + * configure.in (TEXMF): Move check to block with other program + checks. + +Wed Jul 30 11:20:37 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (defun_internal): Allow extra text after + most @def... commands, for tzname[2] in libc.texinfo. + + * info/info.c: Include indices.h. + * configure.in (AC_CHECK_HEADERS): Test for sys/wait.h, info/man.c + uses it. + From: Erick Branderhorst <Erick.Branderhorst@asml.nl>. + +Tue Jul 29 15:55:19 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in: Version 3.9j. + + * info/terminal.c (output_character_function): Return int (the + arg), not void. + + * info/infomap.c: Don't define term_kP as 'v', since that's undefined. + From: Tom Hageman <tom@basil.icce.rug.nl>. + + * makeinfo/makeinfo.c: Parameterize some messages to avoid + duplicate translations. + + * info/terminal.c: Only try to declare ospeed, PC, tputs, etc. if + we don't have <ncurses.h/termcap.h> or <termcap.h>. + + * makeinfo/makeinfo.c (cm_email): New function, like cm_uref. + +Sun Jul 27 17:09:20 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in: Only check for <ncurses/termcap.h> if we're using + -lncurses. + From: Bo Johansson <bo.johansson@mbox2.swipnet.se>. + + * info/dir.c (new_dir_file_p): Avoid automatic struct + initialization, SunOS 4 etc. cc can't handle it. + From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>. + +Sat Jul 26 15:08:13 1997 Karl Berry <karl@cs.umb.edu> + + * Version 3.9i. + + * configure.in: Check for termcap.h and ncurses/termcap.h. + From: bo.johansson@mbox2.swipnet.se. + +Fri Jul 25 14:09:05 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Document new second optional arg to email. + + * info/infodoc.c: Document CTRL-x 0 as the way to get out of help. + + * info/dir.c (maybe_build_dir_node): Really check for the same dir + file twice, not just by name. + (new_dir_file_p): New function. + + * util/install-info.c: Tell them about --help in doc strings. + +Thu Jul 24 14:25:44 1997 Karl Berry <karl@cs.umb.edu> + + * util/texindex.c (memory_error): Move to avoid incorrect implicit + decl. + + * makeinfo/makeinfo.c, + * makeinfo/multi.c, + * util/install-info.c, + * util/texindex.c, + * info/tilde.c, + * info/man.c, + * info/gc.c, + * info/session.c (info_replace_key_to_typeahead): Remove unused + function, + * info/nodemenu.c, + * info/man.c, + * info/m-x.c, + * info/footnotes.c + * info/info.c + * info/indices.c, + * info/filesys.c: Parenthesize to avoid -Wall warnings + remove unused variables, + make return types explicit, + printf type corrections. + + * lib/system.h: <ctype.h>: Include this. + * util/texindex.c, + * makeinfo/makeinfo.c, + * info/echo-area.c, + * info/display.c: ctype.h: Included in system.h now. + + * info/echo-area.c: Parenthesize to avoid -Wall warnings. + (ctype.h): #include for isprint. + (echo_area_stack_depth): Remove unused function. + * info/display.c: Parenthesize to avoid -Wall warnings. + (ctype.h): #include for isprint. + * info/dir.c: Parenthesize to avoid -Wall warnings. + (build_dir_node_internal): Remove declaration of nonexistent function. + From: Erick Branderhorst <Erick.Branderhorst@asml.nl>. + + * configure.in (TEXMF): Call texconfig to discover the default value, + for the sake of the warning in doc/Makefile. + From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>. + + * doc/Makefile.am (TEXMF): New variable. + (install-data-local): Use it in warning. + From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>. + + * info/session.c (initialize_info_session): Only call + terminal_prep_terminal if clear_screen is true. Otherwise, failed + --index-searches prep the terminal but do not unprep it. + From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>. + + * info/nodemenu.c: Doc fix. + +Mon Jul 21 17:11:09 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Comment out @smallbook and @set smallbook so + people at other sites can print it the way they want. + From: Thomas Walter <walter@pctc.chemie.uni-erlangen.de> + +Sun Jul 20 07:52:25 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in: 3.9h. + + * doc/Makefile.am (install-info-am, distclean-aminfo): New targets + to avoid assuming info files are in srcdir. + + * lib/system.h (xstrdup): Returns char *, not void *. + + * doc/Makefile.am (.texi.info), + * doc/Makefile.am (texinfo): Don't run in $(srcdir). + + * util/install-info.c (main): Remove unnecessary decl of strrchr. + + * info/tilde.c: Include info.h (for config.h) before alloca stuff. + + * makeinfo/makeinfo.c (validate_file): Rename `valid' to `valid_p' + to avoid conflict with SunOS 4 header files. + From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>. + + * info/session.c (initialize_info_session): Call + terminal_prep_terminal here (before calling terminal_clear_screen). + (info_session): Instead of here. + From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>. + + * Makefile.am (EXTRA_DIST): Add README-alpha. + +Sat Jul 19 13:50:27 1997 Karl Berry <karl@cs.umb.edu> + + * info/terminal.c: Use `keypad transmit' sequence if it's defined: + (term_keypad_on, term_keypad_off): New statics. + (terminal_begin_using_terminal): If term_keypad_on, send it. + (terminal_end_using_terminal): If term_keypad_off, send it. + (terminal_initialize_terminal): Look up ks and ke termcap strings. + From: William Edward Webber <wew@yallara.cs.rmit.EDU.AU>. + + * info/infomap.c (initialize_info_keymaps): Initialize hardwired + cases for arrow keys a la readline. Found by John Eaton, + jwe@bevo.che.wisc.edu. + + * makeinfo/makeinfo.c (output_pending_notes): Remove footnote + macro expansion code I #if 0'd out some time ago. And doc fixes. + + * Applied this patch: + +Sat Jul 19 16:29:01 1997 Karl Eichwalder <ke@suse.de> + + * info/info.c (main): setlocale, bindtextdomain, and textdomain. + +Fri Jul 18 10:02:18 1997 Karl Berry <karl@cs.umb.edu> + + * doc/Makefile.am (install-data-local), + * emacs/Makefile.am (install-data-local): Give subdir in warning. + + * configure.in: Version 3.9f. + + * doc/texinfo.texi: Correct \^ to @^. + From Andreas S. + + * Merged these changes: + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * info/display.c (display_cursor_at_point): Flush ouput. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * info/session.c (remember_window_and_node): Don't crash when the + current window has no current node. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * util/texindex.c (usage): Translate the doc strings. + * makeinfo/makeinfo.c (cm_today): Translate the month names. + * info/variables.c (describe_variable): Translate the doc strings. + * info/nodes.h: Don't translate the strings defining the info format. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * makeinfo/makeinfo.c (get_item_function): Remove superfluous call + to canon_white after get_rest_of_line. + (cm_end): Likewise. + (handle_variable): Likewise. + (cm_item): Likewise. + (cm_unmacro): Likewise. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * info/nodemenu.c (list_visited_nodes): Don't clear the internal + flag, this and other functions depend on it. Don't insist on + displaying the menu below the current window. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * makeinfo/makeinfo.c (cm_uref): Fix memory leaks. + (cm_inforef): Likewise. Handle empty cross reference name. + +1997-07-17 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * info/echo-area.c (ea_possible_completions): Check that the + current window can actually be split. + +Thu Jul 17 17:19:34 1997 Karl Berry <karl@cs.umb.edu> + + + * emacs/Makefile.am (*clean-lisp): Define, as Automake didn't. + From: Kenneth Stailey <kstailey@disclosure.com>. + + * doc/Makefile.am: Do not distribute info.1. + * makeinfo/macros: Do not distribute this directory, it's merged + into the main documentation. + * doc/makeinfo.texi: Don't distribute this either, it's in the + main manual. + + * util/install-info.c: Use \n\ for multiline string constant. + From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>. + +Wed Jul 16 15:29:50 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: @set must be after @setfilename, I guess. + Noted by Erick Branderhorst. + + * Applied this change: + +Tue Nov 12 22:20:22 1996 John Eaton <jwe@bevo.che.wisc.edu> + + * makeinfo.c (INDEX_ALIST): Use two indices, read_index and + write_index, instead of just one. + (find_index_offset): If a match is found, return index to the + current INDEX_ALIST struct, not the index pointing to the list of + index entries. + (translate_index): Return read_index from the matching + INDEX_ALIST. + (undefindex): Delete the list of index elements pointed to by + read_index from the INDEX_ALIST that matches name. + (defindex): Initialize read_index and write_index. + (index_add_arg): Add entries to the list pointed to by write_index + from the INDEX_ALIST matching name. + (index_append): Delete unused function. + (cm_synindex): Don't merge indcies, just make the write_index for + redirectee the same as the write_index for redirector. + +Tue Jul 15 09:32:04 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Bump edition number for 2.24. + + * util/Makefile.am (localedir): Define. + + * info/window.h: Rename __window__ to window_struct. + + * info/window.h, + * info/variables.h, + * info/search.h, + * info/man.h, + * info/info-utils.h, + * info/gc.h, + * info/footnotes.h, + * info/filesys.h, + * info/echo-area.h, + * info/display.h: Avoid leading _ in #define for #include protection. + + * makeinfo/makeinfo.c: Version 1.68. + * info/info.c: Version 2.17. + + * Most all files: Untabify. + + * doc/Makefile.am (texinfo): Add explicit target. + + * emacs/Makefile.am (noinst_LISP): Remove the obsolete + detexinfo.el (makeinfo --no-headers is better) and + texnfo-tex.el (now handled by TeX modes in general). + +Mon Jul 14 15:21:03 1997 Karl Berry <karl@cs.umb.edu> + + * util/texi2dvi: Update RCS file from 3.9 distribution. + + * util/Makefile.am (EXTRA_DIST): Add update-info, from + rhawes@dmapub.dma.org + +Sun Jul 13 17:05:03 1997 Karl Berry <karl@cs.umb.edu> + + * info/signals.c: Use RETSIGTYPE instead of hardwiring void. + From: "Jeffery L. JT Vogt" <lfm@atw.earthreach.com>. + + * info/session.c (info_history_node): Rewrite as + info_kill_node (current_node). + (kill_node, read_nodename_to_kill): New functions from info_kill_node. + (info_kill_node): Now this just calls them. + +Fri Jul 11 11:56:58 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Fix `Conditionals' xref. + +Thu Jul 10 17:58:12 1997 Karl Berry <karl@cs.umb.edu> + + * doc/info.texi: Don't say SPC clears ? screen. + +Sun Jul 6 16:26:41 1997 Karl Berry <karl@cs.umb.edu> + + * doc/info-stnd.texi: Document --index-search. + + * info/tilde.c, + * info/session.c: Remove redundant getenv decl. + + * Installed following change: +Tue Nov 12 14:44:00 1996 John W. Eaton <jwe@bevo.che.wisc.edu> + + * info/info.c (main): Handle new option, --index-search STRING. + (index_search_p, index_search_string): New static variables, used + to handle --index-search option. + + * info/session.c (initialize_info_session): New arg, + clear_screen. Change all callers. + + * info/indices.h (do_info_index_search, index_intry_exists): + Provide declarations here. + + * info/indices.c (do_info_index_search): New function, extracted + from info_index_search. + (info_index_search): Simply call do_info_index_search() with + search_string set to NULL. + (index_entry_exists): New function. + +Sat Jul 5 17:17:14 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Document @kbdinputstyle. + + * makeinfo/makeinfo.c (kbdinputstyle): New command. + (cm_no_op_line_arg): New function. + + * info/termdep.h (HAVE_TERMIOS_H) [NeXT]: #undef. + From: Gregor Hoffleit <flight@mathi.uni-heidelberg.de> et al. + +Fri Jul 4 14:18:08 1997 Karl Berry <karl@cs.umb.edu> + + * info/Makefile.am (EXTRA_DIST), + * util/Makefile.am (EXTRA_DIST), + * makeinfo/Makefile.am (EXTRA_DIST), + * lib/Makefile.am (EXTRA_DIST): Include README. + + * doc/texinfo.texi (makeinfo options): Document --paragraph-indent + values more completely. + * makeinfo/makeinfo.c (set_paragraph_indent): Allow translated + asis or none, improve doc. + From ke. + + * doc/Makefile.am (dist-info): New empty target so that we do not + distribute info files. + From Erick Branderhorst. + + * doc/texinfo.texi (Invoking install-info): Document that the dir + file is created now if need be. + * Makefile.am (EXTRA_DIST): No longer need dir. + * util/install-info.c (ensure_dirfile_exists): New routine. + (main): Call it before trying to open dirfile for reading. + + * doc/texinfo.texi: Document install-info --delete a little better. + * util/install-info.c: Set something_deleted when we delete a + normal line. + Bug from: Denis Kosygin <dkosygin@math.Princeton.EDU>. + + * util/install-info.c: If no info dir entry, give warning and exit 0. + +Wed Jul 2 06:35:17 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in (ALL_LINGUAS): Add fr. + + * makeinfo/makeinfo.h (insertion_type, insertion_type_names): Add + ifnot... entries. Alphabetize. + +Tue Jul 1 17:21:54 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (sort_index): Set defining_line and + input_filename so errors in index entries are reported at + the correct location. From rms. + + * makeinfo/makeinfo.c (cm_ifnothtml, etc.): Routines for new + commands. + +Sun Jun 29 09:44:01 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Document new @ifnot... commands, etc. + * doc/texinfo.texi: Document @image, etc. + +Thu Jun 26 17:57:37 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (cm_image): New routine for new command @image. + (cm_end): Move to better place, doesn't need its own page. + Doc fixes. + +Mon Jun 23 16:54:03 1997 Karl Berry <karl@cs.umb.edu> + + * Makefile.am (SUBDIRS): Do intl first. + + * doc/Makefile.am (EXTRA_DIST): Include epsf.tex. + (install-data-local): Suggest possible installation directory. + * epsf.tex: New file. + +Wed Jun 18 17:51:52 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Document texinfo.cnf. + +Sun Jun 15 14:37:58 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi (Command List): Various commands missing or + erroneous. + From: Karl_Heinz_Marbaise@p69.ks.fido.de. + + * makeinfo/makeinfo.c: Oops, failed to break out of loop. + + * util/texindex.c: Use <getopt.h> not "getopt.h". + + * All source files: Merge gettext changes from Karl E.; + his ChangeLog entries below. + +Sat Jun 14 17:04:28 1997 Karl Berry <karl@cs.umb.edu> + + * Makefile.am, + * makeinfo/Makefile.am: Doc fix. + * util/Makefile.am (EXTRA_DIST): Add texi2dvi. From Karl E. + +Fri Jun 13 17:39:34 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c [WIN32]: Handle read bogosity and c:\ + absolute paths. + From: Eric Hanchrow <erich@MICROSOFT.com>. + + * configure.in (AC_CHECK_HEADERS): Check for pwd.h. + * info/tilde.c (pwd.h): Move #include to system.h. + + * makeinfo/makeinfo.c (main): New option -P to prepend to search path. + From: Kenneth Stailey <kstailey@cvs.openbsd.org>. + + * doc/texinfo.texi (Invoking makeinfo), + * doc/makeinfo.texi: Mention -P. + +Thu Jun 12 16:25:40 1997 Karl Berry <karl@cs.umb.edu> + + * info/signals.h (SIGCHLD): #define as SIGCLD if undefined, for sysV68. + From: "Philippe De Muyter" <phdm%labauto1@ulb.ac.be>. + + * util/install-info.c (O_RDONLY): Remove this stuff, it's in system.h. + (main): Handle existing entry in dir file having .info extension. + From: "Bradley C. Kuszmaul" <bradley@GRANITE.SYSTEMSX.CS.YALE.EDU>. + + * makeinfo/makeinfo.c (get_char_len): Don't count 8-bit characters + as two chars in the output. + From: Sung-Hyun Nam <namsh@amuna.rms.lgic.co.kr>. + +Wed Jun 11 16:36:51 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi (Other Info Directories): Document new trailing + : in INFOPATH feature. + + * info/info.c (main): Have trailing : in INFOPATH expand to the + default path. + +Fri Jun 6 13:22:02 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi (uref): New node for new command. + +Thu Jun 5 18:13:48 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (cm_uref): New function to accept optional + second argument. Call it in command table. + +Sat Jun 14 10:54:16 1997 Karl Eichwalder <ke@suse.de> + + * mkinstalldirs: Update from automake-1.1p. + + * configure.in: Touch po/ChangeLog (gettext needs it). + +Thu Jun 12 08:37:52 1997 Karl Eichwalder <ke@ke.Central.DE> + + * util/texindex.c: Include system.h, remove config.h. + + * po/POTFILES.in: Fill it. + + * makeinfo/multi.c: Include system.h. + + * info/Makefile.am: + * makeinfo/Makefile.am: + * util/Makefile.am: + (localedir): Set. + (INCLUDES): Add intl/ and LOCALEDIR. + (LDADD): Add @INTLLIBS@. + + * makeinfo/makeinfo.c (main): + * util/texindex.c (main): + * util/install-info.c (main): + setlocale, bindtextdomain, and textdomain. + + * lib/system.h: Include locale.h and libintl.h. + + * acconfig.h: Include libintl.h. + (_, N_): Define. + Add ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_LC_MESSAGES, + HAVE_STPCPY for libintl. + Add @TOP@ and @BOTTOM@. + + * configure.in (AM_GNU_GETTEXT): Add. + (AC_OUTPUT): Process Makefiles in intl/ and po/. + (ALL_LINGUAS): Available languages. + + * Makefile.am (AUTOMAKE_OPTIONS): Now use 1.1p. + +Wed Jun 11 17:05:37 1997 Karl Eichwalder <ke@ke.Central.DE> + + * Makefile.am (SUBDIRS): Add intl/ and po/ for NLS. + + * run `gettextize -c' to get the i18n skeleton. + +Wed Jun 4 17:51:08 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (uref): New command, another alias for @code + for now. + +Wed Jun 4 02:02:33 1997 Miles Bader <miles@gnu.ai.mit.edu> + + * doc/texinfo.texi (email): { and } need @ escapes. + +Sun Jun 1 16:34:12 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi (itemx): @itemx should always follow @item. + + * makeinfo/makeinfo.c (cm_item): Insert blank line if two + consecutive @item's. + From: Karl Eichwalder <ke@ke.central.de>. + Also various doc fixes. + +Tue May 27 17:20:44 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi (various): Document @deftypemethod. + (email): @ should have been @@ in the example. + From: Mate Wierdl <mw@wierdlmpc.msci.memphis.edu> + +Mon May 26 16:56:26 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/multi.c (setup_multitable_parameters): Avoid use of %n + for sake of m68k-hp-bsd. + From: Derek L Davies <ddavies@world.std.com>. + + * info/terminal.c (terminal_begin_using_terminal, + terminal_end_using_terminal): Call fflush and sleep to handle + cmdtool/shelltool with scrollbars. Also ignore + SIGWINCH so we do not prematurely exit. Move call. + (terminal_prep_terminal): Disable LNEXT (CTRL-V). + From: strube@physik3.gwdg.de (Hans Werner Strube). + + * configure.in (AC_TYPE_SIGNAL): Check this. + +Sun May 25 16:49:58 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (discard_insertions): Take arg saying + whether ifinfo/ifset/etc. are ok. + (convert_from_loaded_file): At `finished', call discard_insertions. + (handle_variable_internal): Complain if we reach eof before the + @end for a false condition. + From: HERBERT@boevm4.vnet.ibm.com. + + * info/Makefile.am (ginfo_SOURCES): Add doc.h. + * lib/Makefile.am (libtxi_a_SOURCES): Add system.h. + +Sat May 24 18:08:27 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c: Check that we have macro_expansion_filename + before using strcmp. + +Thu May 22 17:59:46 1997 Karl Berry <karl@cs.umb.edu> + + * doc/makeinfo.texi: Minimally document --force. + + * makeinfo/makeinfo.c (--force): New option. + (-E): Allow stdout via `-'. + (convert_from_loaded_file): Unlink output files if errors and !force. + +Tue May 20 17:48:42 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c: Change all strdup calls to xstrdup. + (xmalloc, xrealloc, memory_error): Remove these functions, they're + in lib. + (set_paragraph_indent, cm_paragraph_indent): Move to misc page. + (cm_footnote): Expand macros in the arg for the macro expansion output. + +Fri May 16 17:26:59 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (cm_macro): Allocate an empty body if the + macro was empty. + (cm_unmacro): Allocate one more byte for the null. + From: Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE>. + +Sun May 11 17:51:21 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * makeinfo/makeinfo.c (cm_printindex): Fix calculation of the + length of an index line. + +Sun May 11 14:47:42 1997 Tom Tromey <tromey@cygnus.com> + + * makeinfo/makeinfo.c (main): Don't unconditionally run usage when + -e specified. + +Sun May 11 17:47:42 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (init_indices): Free the source for an @synindex. + (undefindex): Do not go further if the target was already freed. + (free_index): Do not free the node names, as init_tags already did. + (cm_synindex, index_add_arg): Improve error message. + (program_index, function_index, etc.): Remove these unused #defines. + +Tue May 6 17:53:37 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (init_internals): Do not free current_node, + it already is, at least when multiple input files are specified. + From: Karl Eichwalder <ke@ke.central.de>. + +Mon May 5 16:14:39 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Mention both alignment and non-alignment of + continuation description lines in menus (Arnold). + +Sun Apr 27 16:12:44 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (apply): Handle body being `\string'. + Also, avoid dereferencing a null pointer when a macro has no named + parameters. + From: Eli Zaretskii <eliz@is.elta.co.il>. + + * makeinfo/makeinfo.c: Wording changes/fixes in warnings. + + * info/session.c (info_get_input_char): Do not mix stdio with raw I/O. + From: Egil Kvaleberg <egilk@sn.no>. + + From Tom Hageman <tom@basil.icce.rug.nl>. These changes make + arrow keys work: + * info/infomap.c: Add arrow key bindings. + (keymap_bind_keyseq): New support function. + (initialize_info_keymaps): Use it. + (term_ku,term_kd,term_kl,term_kr): Remove explicit declarations; + use #include "terminal.h" instead. + * info/session.c (initialize_info_session): Unbuffer stdin. + (info_get_another_input_char): Fix bug in `ready' logic. + * info/terminal.h, + * info/terminal.c (term_kP, term_kN): New variables to hold + PageUp, PageDown key sequences. + (terminal_initialize_terminal): Set them. + + * util/texindex.c (main), + * util/install-info.c (main), + * makeinfo/makeinfo.c (print_version_info), + * info/info.c (main): Use PACKAGE and VERSION from Automake for + printing version number. + +Sat Apr 26 19:19:46 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (get_until_in_line): Do not expand if + executing_string. + Also, free temporary strings. + Also, untabify entire file. + + * doc/texinfo.texi: Many corrections from Arnold. + +Thu Apr 24 16:31:09 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/multi.c (draw_horizontal_separator): Account for indent + here also. From Ulrich. + +Wed Apr 23 15:15:34 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (cm_today): Use time_t instead of long; + everyone else does. + (LOCALTIME_CAST): Remove kludge, we'll always use time_t now. + + * info/Makefile.am (ginfo_SOURCES): Remove general.h, that got + merged into system.h. + +Mon Apr 21 17:13:25 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/multi.c (output_multitable_row): Account for + column_indent, both the global one and for each column. + (setup_multitable_parameters): Account for column_indent in the table + width in the columnfrac case, but don't bother with the template + case for now. + +Sun Apr 20 16:32:00 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (output_stream): Remove redundant + definition; it's in makeinfo.h, + and a vaxstation-ultrix4.3 fails to link because of the two defns. + From: Anders Olofsson <anders@kid025.ericsson.se>. + + * makeinfo/makeinfo.c (expansion): Inhibit appending to the macro + expansion stream. + (get_until_in_line): Possibly expand the text. + Change caller in get_node_token to do the expansion, + all other calls to remain the same. + + * makeinfo/makeinfo.c (cm_node): No need to call strlen to check + for the empty string. + + * doc/texinfo.texi: Restore missing @c for initial comment. + +Fri Apr 18 17:41:36 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Mention that .info is unnecessary in the info + file name argument of an xref. + + * doc/texinfo.texi: Mention texi2dvi -t instead of embedding + @smallbook or @afourpaper in the document source. + +Sun Apr 13 15:19:08 1997 Karl Berry <karl@cs.umb.edu> + + * lib/system.h (_GNU_SOURCE): #define. + +Mon Apr 7 16:30:11 1997 Karl Berry <karl@cs.umb.edu> + + * doc/info.texi, + * doc/info-stnd.texi, + * doc/texinfo.texi: Do not make (dir) the previous ptr from the top node, + and tell people not to do that in the manual. + From: rmedina@kanojo.ivic.ve (Rodrigo Medina), + confirmed by rms. + +Fri Apr 4 16:30:33 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c: Move error page to top to avoid + prototypes, and do add prototypes for add_word_args and execute_string, + so we can use <stdarg.h>. + + * info/makedoc.c, + * info/nodemenu.c: Use %ld instead of %d for file offsets. + * makeinfo/makeinfo.c (delete_macro): Decrement macro_list_len. + (get_macro_args): Decrement line number if see \n. + * utils/texindex.c (indexify): Use fputs instead of fprintf + for constant string. + From: Eli Zaretskii <eliz@is.elta.co.il>. + +Thu Apr 3 17:40:52 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in (AC_CHECK_HEADERS): No need to check for vararg.h + here, AC_FUNC_VPRINTF does it. + (AC_CHECK_FUNCS): Likewise for vsprintf and vfprintf. + * makeinfo/makeinfo.c (add_word_args, execute_string): Rewrite + like the error functions. + +Wed Apr 2 17:46:28 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in: Add AC_FUNC_VPRINTF. + * makeinfo/makeinfo.c (error, line_error, warning): Rewrite a la + error.c from the *utils to use <stdarg.h> if available. + +Tue Apr 1 11:48:40 1997 Karl Berry <karl@cs.umb.edu> + + * doc/texinfo.texi: Tabs are a bad idea. + + * doc/userdoc.texi, + * doc/info.texi: Untabify. + +Sun Mar 30 17:36:47 1997 Karl Berry <karl@cs.umb.edu> + + * makeinfo/makeinfo.c (end_of_sentence_p): New function. + (add_char): Call it, instead of simply sentence_ender. + (post_sentence): New macro. + Also, remove some #include's now in system.h. + * lib/system.h [VMS]: #include <perror.h>, from makeinfo. + +Thu Mar 27 17:41:03 1997 Karl Berry <karl@cs.umb.edu> + + * info/search.c (skip_node_characters): Do not arbitrarily + strip trailing period from end of node name; this is valid. + +Mon Mar 24 16:44:42 1997 Karl Berry <karl@cs.umb.edu> + + * configure.in (AC_OUTPUT): Don't need to create stamp-h here, + tromey says AM_CONFIG_HEADER will do it. + + * info/Makefile.am, util/Makefile.am, makeinfo/Makefile.am (INCLUDES): + Don't need -I.. (for config.h) or -I$(srcdir), says tromey. + Automake includes those already. + +Fri Mar 14 15:05:17 1997 Karl Berry <karl@cs.umb.edu> + + * info/Makefile.am: Build as ginfo, install as info, + to avoid conflict with the standard info target. + + * lib/system.h: New file. + * makeinfo/makeinfo.c (strerror): Remove declaration, + include system.h, remove other redundant #if stuff. + * info/general.h: Include system.h instead of doing common stuff. + * util/install-info.c (my_strerror): Remove this, use strerror, + include system.h. + + * info/terminal.c (terminal_prep_terminal): Only use OCRNL and + ONLCR if they are defined. Reported by many people. + + * Installed: + + Sun Dec 1 19:23:54 1996 Karl Eichwalder <ke@ke.Central.DE> + + * configure.in (TERMLIBS): Add ncurses. + +Thu Mar 13 13:59:45 1997 Karl Berry <karl@cs.umb.edu> + + * lib/Makefile.am (libtxi_a_SOURCES): Add xstrdup.c. + * info/*.c: Use xstrdup instead of strdup everywhere. + + * info/tilde.c: Do not include clib.h, move stdlib.h include to + * info/general.h: here. + + * configure.in (AC_CONFIG_HEADER): Use this, + to avoid hugely long compile line with all the -D's. + * info/general.h: Include <config.h>. + + * emacs/Makefile.am (install, install-data): Do @echo + to tell the user to compile/install the elisp manually. + + * configure.in (AC_REPLACE_FUNCS): Move strerror check to here. + (AC_CHECK_FUNCS): From here. + + * lib/strerror.c: New file, from enscript (et al.) distribution. + +Tue Mar 11 16:36:25 1997 Karl Berry <karl@cs.umb.edu> + + * info/Makefile.am (info_SOURCES): Add doc.c, dribble.c, infodoc.c. + (LDADD): Add @TERMLIBS@. + + * info/info.h: HANDLE_MAN_PAGES, NAMED_FUNCTIONS: Define these. + + * info/filesys.h: Spurious ! when DEFAULT_INFOPATH is not defined. + + * configure.in (AC_OUTPUT): Do lib first and doc last. + + * info/echo-area.c, + * info/echo-area.h, + * info/info.h: Rename echo_area to echo-area. + +Mon Mar 10 17:59:05 1997 Karl Berry <karl@cs.umb.edu> + + * */Makefile.am: Write Makefile.am files for Automake. + * doc: New subdirectory, move all manuals and texinfo.tex there. + * AUTHORS, THANKS, config.guess, config.sub, mkinstalldirs: New files, + required by Automake. + * lib/xmalloc.c: Move from info/. + Fri Oct 4 07:49:49 1996 Karl Berry <karl@cs.umb.edu> * Version 3.9. diff --git a/gnu/usr.bin/texinfo/Makefile.am b/gnu/usr.bin/texinfo/Makefile.am new file mode 100644 index 00000000000..f861d14ea98 --- /dev/null +++ b/gnu/usr.bin/texinfo/Makefile.am @@ -0,0 +1,15 @@ +## Makefile.am for texinfo. +## $Id: Makefile.am,v 1.1 1997/08/01 21:59:31 kstailey Exp $ +## Process this file with automake to produce Makefile.in in all directories. + +## Be sure we're using the right version of Automake. +AUTOMAKE_OPTIONS = 1.1p + +# Additional files to distribute. +EXTRA_DIST = INTRODUCTION dir-example README-alpha + +# All subdirectories. +# Do intl/ and lib/ first since the C programs depend on them. +# Do doc/ last so makeinfo will be built when we get there. +# Others are alphabetical. +SUBDIRS = intl lib emacs info makeinfo po util doc diff --git a/gnu/usr.bin/texinfo/NEWS b/gnu/usr.bin/texinfo/NEWS index ffc70933396..968184177ff 100644 --- a/gnu/usr.bin/texinfo/NEWS +++ b/gnu/usr.bin/texinfo/NEWS @@ -1,5 +1,39 @@ This file records noteworthy changes. +3.11 (31 July 1997) +* New commands: + - @uref to make a reference to a url; @url now only indicates such. + - @image to include graphics (epsf for TeX). + - @deftypemethod and @deftypemethodx to document methods in strongly + typed object-oriented languages, such as C++. + - @html for raw HTML. + - @ifnothtml @ifnotinfo @ifnottex for more precise conditionals. + - @kbdinputstyle to control when @kbd uses the slanted typewriter font. + - @email takes second optional argument. +* texinfo.tex reads texinfo.cnf (if present) for site-wide TeX + configuration; for example, A4 paper sizes. +* info: + - arrow keys supported. + - trailing : in INFOPATH appends default path. + - new option --index-search for online help support. +* makeinfo: + - output files removed if errors unless (new option) --force. + - new option -P to prepend to search path. + - macro expansion file can be standard output. +* install-info creates a new dir file if necessary. +* update-info script to create a dir file from all info files. +* Elisp: texnfo-tex.el and detexinfo.el removed from the distribution; + - texnfo-tex features are now part of standard TeX & Texinfo packages; + - makeinfo --no-headers does a better job than detexinfo.el. +* Documentation: + - Updates, revisions, corrections in the manual. + - makeinfo.texi removed, as it was a copy of what was in texinfo.texi. +* gettext support in sources, French and German translations included. +* info man page removed; use the Texinfo manual. +* Automake used, other portability fixes. + +3.10 (nonexistent) + 3.9 (4 October 1996) * makeinfo: - Give a suppressible (with --no-validate) error for references @@ -91,3 +125,205 @@ This file records noteworthy changes. Just bug fixes, see ChangeLog for full details. texinfo-3.0: first release of Texinfo version 2, with many new commands. + + +Here is the separate NEWS for old releases of Info: + +Version 2.11, Sat Apr 1 09:15:21 1995 + +Changes since 2.7 beta: + +Although the basic code remains the same, there are numerous nits +fixed, including some display bugs, and a memory leak. Some changes +that have taken place with larger impact include the way in which the +(dir) node is built; I have added in support for "localdir" +directories among other things. Info files may be stored in +compressed formats, and in their own subdirectories; menu items which +do not explicitly name the node to which they are attached have the +menu item name looked up as an Info file if it is not found within the +current document. This means that the menu item: + +* Info:: The Info documentation reader. + +in (dir) refers to the info node "(info)Top". + +Please see the ChangeLog and documentation for details on other +changes. + +Version 2.7 beta, Wed Dec 30 02:02:38 1992 +Version 2.6 beta, Tue Dec 22 03:58:07 1992 +Version 2.5 beta, Tue Dec 8 14:50:35 1992 +Version 2.4 beta, Sat Nov 28 14:34:02 1992 +Version 2.3 beta, Fri Nov 27 01:04:13 1992 +Version 2.2 beta, Tue Nov 24 09:36:08 1992 +Version 2.1 beta, Tue Nov 17 23:29:36 1992 + +Changes since 2.5 beta: + +Note that versions 2.6 and 2.7 Beta were only released to a select group. + +* "info-" removed from the front of M-x commands. + +* Automatic footnote display. When you enter a node which contains + footnotes, and the variable "automatic-footnotes" is "On", Info pops + up a window containing the footnotes. Likewise, when you leave that + node, the window containing the footnotes goes away. + +* Cleaner built in documentation, and documentation functions. + + Use: + o `M-x describe-variable' to read a variable's documenation + o `M-x describe-key' to find out what a particular keystroke does. + o `M-x describe-function' to read a function's documentation. + o `M-x where-is' to find out what keys invoke a particular function. + +* Info can "tile" the displayed windows (via "M-x tile-windows"). If + the variable "automatic-tiling" is "On", then splitting a window or + deleting a window causes the remaining windows to be retiled. + +* You can save every keystroke you type in a "dribble file" by using the + `--dribble FILENAME' option. You can initially read keystrokes from an + alternate input stream with `--restore FILENAME', or by redirecting + input on the command line `info < old-dribble'. + +* New behaviour of menu items. If the label is the same as the + target node name, and the node couldn't be found in the current file, + treat the label as a file name. For example, a menu entry in "DIR" + might contain: + + * Emacs:: Cool text-editor. + + Info would not find the node "(dir)Emacs", so just plain "(emacs)" + would be tried. + +* New variable "ISO-Latin" allows you to use European machines with + 8-bit character sets. + +* Cleanups in echo area reading, and redisplay. Cleanups in handling the + window which shows possible completions. + +* Info can now read files that have been compressed. An array in filesys.c + maps extensions to programs that can decompress stdin, and write the results + to stdout. Currently, ".Z"/uncompress, ".z"/gunzip, and ".Y"/unyabba are + supported. The modeline for a compressed file shows "zz" in it. + +* There is a new variable "gc-compressed-files" which, if non-zero, says + it is okay to reclaim the file buffer space allocated to a file which + was compressed, if, and only if, that file's contents do not appear in + any history node. + +* New file `nodemenu.c' implements a few functions for manipulating + previously visited nodes. `C-x C-b' (list-visited-nodes) produces a + menu of the nodes that could be reached by info-history-node in some + window. `C-x b' (select-visited-node) is similar, but reads one of + the node names with completion. + +* Keystroke `M-r' (move_to_screen_line) allows the user to place the cursor at + the start of a specific screen line. Without a numeric argument, place the + cursor on the center line; with an arg, place the cursor on that line. + +* Interruptible display implemented. Basic display speedups and hacks. +* The message "*** Tags Out of Date ***" now means what it says. +* Index searching with `,' (info-index-next) has been improved. +* When scrolling with C-v, C-M-v, or M-v, only "Page Only" scrolling + will happen. + +* Continous scrolling (along with `]' (info-global-next) and `[' + (info-global-prev) works better. `]' and `[' accept numeric + arguments, moving that many nodes in that case. + +* `C-x w' (info-toggle-wrap) controls how lines wider than the width + of the screen are displayed. If a line is too long, a `$' is + displayed in the rightmost column of the window. + +* There are some new variables for controlling the behaviour of Info + interactively. The current list of variables is as follows: + + Variable Name Default Value Description + ------------- ------------- ----------- + `automatic-footnotes' On When "On", footnotes appear and + disappear automatically. + + `automatic-tiling' Off When "On", creating of deleting a + window resizes other windows. + + `visible-bell' Off If non-zero, try to use a visible bell. + + `errors-ring-bell' On If non-zero, errors cause a ring. + + `show-index-match' On If non-zero, the portion of the string + matched is highlighted by changing its + case. + + `scroll-behaviour' Continuous One of "Continuous", "Next Only", or + "Page Only". "Page Only" prevents you from + scrolling past the bottom or top of a node. + "Next Only" causes the Next or Prev node to + be selected when you scroll past the bottom + or top of a node. "Continous" moves + linearly through the files hierchichal + structure. + + `scroll-step' 0 Controls how scrolling is done for you when + the cursor moves out of the current window. + Non-zero means it is the number of lines + you would like the screen to shift. A + value of 0 means to center the line + containing the cursor in the window. + + `gc-compressed-files' Off If non-zero means it is okay to reclaim the + file buffer space allocated to a file which + was compressed, if, and only if, that + file's contents do not appear in the node + list of any window. + + `ISO-Latin' Off Non-zero means that you are using an ISO + Latin character set. By default, standard + ASCII characters are assumed. +________________________________________ +This release of Info is version 2.5 beta. + +Changes since 2.4 beta: + +* Index (i) and (,) commands fully implemented. +* "configure" script now shipped with Info. +* New function "set-variable" allows users to set various variables. +* User-settable behaviour on end or beginning of node scrolling. This + supercedes the SPC and DEL changes in 2.3 beta. + +________________________________________ +This release of Info is version 2.4 beta. + +Changes since 2.3 beta: + +* info-last-node now means move to the last node of this info file. +* info-history-node means move backwards through this window's node history. +* info-first-node moves to the first node in the Info file. This node is + not necessarily "Top"! +* SPC and DEL can select the Next or Prev node after printing an informative + message when pressed at the end/beg of a node. + +---------------------------------------- +This release of Info is version 2.3 beta. + +Changes since 2.2 beta: + +* M-x command lines if NAMED_COMMANDS is #defined. Variable in Makefile. +* Screen height changes made quite robust. +* Interactive function "set-screen-height" implements user height changes. +* Scrolling on some terminals is faster now. +* C-l with numeric arguement is fixed. + +---------------------------------------- +This release of Info is version 2.2 beta. + +Changes since 2.0: + +* C-g can now interrupt multi-file searches. +* Incremental search is fully implemented. +* Loading large tag tables is much faster now. +* makedoc.c replaces shell script, speeding incremental builds. +* Scrolling in redisplay is implemented. +* Recursive uses of the echo area made more robust. +* Garbage collection of unreferenced nodes. + diff --git a/gnu/usr.bin/texinfo/README b/gnu/usr.bin/texinfo/README index 357a98fb555..0312f85e6f6 100644 --- a/gnu/usr.bin/texinfo/README +++ b/gnu/usr.bin/texinfo/README @@ -1,23 +1,38 @@ -Texinfo, Version 3 -================== +This is the README file for the GNU Texinfo distribution. + +Please email bugs or suggestions to bug-texinfo@prep.ai.mit.edu. -This is the README file for version 3 of the Texinfo distribution. Files within this distribution have their own version and edition -numbers. When you refer to a file, please mention its own number, as +numbers. When you refer to a file, please mention its own version, as well as the version number of the Texinfo distribution. -PLEASE REPORT BUGS TO: bug-texinfo@prep.ai.mit.edu +For instructions on compiling and installing info, makeinfo, texi2dvi, +and texindex, please read the file `INSTALL'. Also: + + * The Emacs Lisp files are not compiled or installed by default; to + install them, use `make install' in the `emacs' subdirectory. See + ./emacs/README for some considerations. + + * The Info tree uses a file `dir' as its root node; the `dir-example' + file in this distribution is included for informative purposes. + Use it or not as you like. + + * You can create a file texinfo.cnf to be read by TeX when + processing Texinfo manuals. For example, it might contain the + command @afourpaper. See the `Preparing for TeX' node in + texinfo.texi for more details. + Texinfo is a documentation system that uses a single source file to -produce both on-line information and printed output. This means that -instead of writing two different documents, one for the on-line help -or other on-line information and the other for a typeset manual or -other printed work, you need write only one document. When the work -is revised, you need revise only one document. You can read the -on-line information, known as an "Info file", with an Info -documentation-reading program. By convention, Texinfo source file -names end with a `.texi' or `.texinfo' extension. Texinfo is -described in the Texinfo manual (the file ./texinfo.texi). +produce both online information and printed output. This means that +instead of writing two different documents, one for the online help or +other online information and the other for a typeset manual or other +printed work, you need write only one document. When the work is +revised, you need revise only one document. You can read the online +information, known as an "Info file", with an Info documentation-reading +program. By convention, Texinfo source file names end with a `.texi' or +`.texinfo' extension. Texinfo is described in the Texinfo manual (the +file ./doc/texinfo.texi). You can write and format Texinfo files into Info files within GNU Emacs, and read them using the Emacs Info reader. If you do not have Emacs, @@ -26,22 +41,15 @@ them using `info'. Use TeX, which is not included in this package (see `How to Obtain TeX' in the Texinfo manual for information), to typeset Texinfo files for printing. -For instructions on compiling and installing info, makeinfo, texi2dvi, -and texindex, please read the file `INSTALL'. The Emacs Lisp files are -not installed by default; to install them, use `make install' in the -`emacs' subdirectory. The Info tree uses a file `dir' as its root node; -a sample `dir' file is included in the distribution, but not installed -anywhere. Use it or not as you like. This distribution includes (but is not limited to) the following files: README This file. - INTRODUCTION This file tells you how to create readable files from the Texinfo source files in this distribution. -Texinfo source files: +Texinfo source files (in ./doc): texinfo.texi This manual describes Texinfo. It tells how to use Texinfo to write @@ -61,15 +69,8 @@ Texinfo source files: info-stnd.texi This manual tells you how to use the standalone GNU Info reader that is - included in this distribution as a C - source file, `info.c'. - - makeinfo.texi This manual tells you how to use - makeinfo. The same information is - contained in a chapter of the Texinfo - manual; it has been extracted here for - your convenience. - + included in this distribution as C + source (./info). Printing related files: @@ -78,18 +79,18 @@ Printing related files: Texinfo file into a DVI file ready for printing. - texindex.c This file contains the source for + util/texindex.c This file contains the source for the `texindex' program that generates sorted indices used by TeX when typesetting a file for printing. - texi2dvi This is a shell script for + util/texi2dvi This is a shell script for producing an indexed DVI file using TeX and texindex. Must be used if the source document uses Texinfo @macros. -GNU Emacs related files: +GNU Emacs related files (in ./emacs): texinfmt.el This Emacs Lisp file provides the functions that GNU Emacs uses to @@ -100,19 +101,15 @@ GNU Emacs related files: for GNU Emacs. texnfo-upd.el These files provides commands to - texnfo-tex.el help you write Texinfo files - makeinfo.el using GNU Emacs Texinfo mode. - - detexinfo.el This extra utility file contains functions - to remove Texinfo commands from a - Texinfo source file. + makeinfo.el help you write Texinfo files + using GNU Emacs Texinfo mode. info.el These are the standard GNU Emacs informat.el Info reading and support files, included here for your convenience. -Source files for standalone C programs: +Source files for standalone C programs (./lib, ./makeinfo, ./info): makeinfo.c This file contains the source for the `makeinfo' program that you can @@ -128,7 +125,7 @@ Source files for standalone C programs: getopt.h -C Installation files: +Installation files: configure This file creates creates a Makefile which in turn creates an `info' or @@ -136,10 +133,14 @@ C Installation files: distribution. configure.in This is a template for creating - `configure' using m4 macros. + `configure' using Autoconf. Makefile.in This is a template for `configure' - to use to make a Makefile. + to use to make a Makefile. Created by + Automake. + + Makefile.am This is a template for Automake + to use to make a Makefile.in. Other files: @@ -148,10 +149,6 @@ Other files: features since the first edition of Texinfo. - info.1 This is a `man' page that briefly - describes the standalone `info' - program. - fixfonts This is a shell script to install the `lcircle10' TeX fonts as an alias for the `circle10' fonts. In some older diff --git a/gnu/usr.bin/texinfo/README-alpha b/gnu/usr.bin/texinfo/README-alpha new file mode 100644 index 00000000000..2661145da82 --- /dev/null +++ b/gnu/usr.bin/texinfo/README-alpha @@ -0,0 +1,11 @@ +Please report bugs in this alpha distribution to + texinfo-pretest@cs.umb.edu +rather than bug-texinfo@prep. Thanks. + +You can get on texinfo-pretest, if you're not already, +by sending a message whose body is + subscribe you@your.preferred.email.address + +to texinfo-pretest-request@cs.umb.edu. +And you can get off the list by sending an unsubscribe message. +(I use majordomo to maintain the list.) diff --git a/gnu/usr.bin/texinfo/THANKS b/gnu/usr.bin/texinfo/THANKS new file mode 100644 index 00000000000..daa1cfe7098 --- /dev/null +++ b/gnu/usr.bin/texinfo/THANKS @@ -0,0 +1,9 @@ +Thanks to these contributors and many more ... + +Dave Love +Donald Knuth +Erick Branderhorst +Karl Eichwalder +Laurent Bourbeau +Stephen Gildea +William Bader diff --git a/gnu/usr.bin/texinfo/TODO b/gnu/usr.bin/texinfo/TODO index de5b571722f..7a7eb858e8c 100644 --- a/gnu/usr.bin/texinfo/TODO +++ b/gnu/usr.bin/texinfo/TODO @@ -1,35 +1,78 @@ If you are interested in working on any of these, email bug-texinfo@prep.ai.mit.edu. -* Use Automake. +* Makeinfo: + - HTML output. + - A detexinfo program, like detex or delatex. This command would + strip all the texinfo commands out, and would be used as a filter on + the way to a speller. An option would be to NOT strip comments out. + makeinfo --no-headers comes close. + - If node name contains an @ command, complain explicitly. + - Better ASCII output: convert menus to single table of contents, + enumerate chapters and sections, convert cross-refs and indices to + chapter/section references. See: + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/faq201s.zip -* Use a config header file instead of @DEFS@. +n* TeX: + - Use @ as the escape character, and Texinfo syntax generally, in the + table of contents, aux, and index files. Eliminate all the crazy + multiple redefinitions of every Texinfo command in different contexts. + - Handle @hsep and @vsep in @multitables. -* A detexinfo program, like detex or delatex. This command would - strip all the texinfo commands out, and would be used as a filter on - the way to a speller. An option would be to NOT strip comments out. - makeinfo --no-headers come close. +* General: + - Better i18n support, including support for 8-bit input characters, + and 8-bit output in info. Perhaps have to use the ec fonts. + - Support compressed image files, automatic generation of .txt + or .jpg from .eps by Ghostscript. + - Repeat TeX run until cross-references stabilize, not just twice. + (Document this in manual and fix texi2dvi.) + - Handle reference card creation, perhaps by only paying attention to + sectioning and @def... commands. + - Allow : in node names for info files, for names like `class::method'. + - Get Info declared as a MIME Content-Type. -* Change bars. This is difficult or impossible in TeX, - unfortunately. To do it right requires device driver support. +* Language: + - @figure: +@figure [xref-label] +@figureinclude <filename>, [<height>], [<width>] +@figurehsize <dimen> +@figurevsize <dimen> +@caption ... @end caption +<arbitrary Texinfo commands> +@end figure + - @flushboth to combine @flushleft and @flushright, for RFC's. + - @part sectioning command. + - Anchors a la HTML? + - Allow subitems and `see' and `see also' in indices. + - @exercise/@answer command for, e.g., gawk. + - Allow @hsep/@vsep at @item, instead of just in template. + - The dark corner symbol for the gawk manual. + - Change bars. This is difficult or impossible in TeX, + unfortunately. To do it right requires device driver support. -* The dark corner symbol for the gawk manual. +* Doc: + - Include a complete functional summary, as in a reference card, in + the manual. + - Improve the manuals for makeinfo, standalone info, etc. + - Page 39, need a new section on doing dedication pages. See gawk.texi + for an example of doing it in both the tex and info versions. -* Better i18n support, including support for 8-bit input - characters. Requires fonts, and the DC fonts are not (as of this - writing) free. +* Info: + - Search all nodes of dir file at startup, then can have + INFO-DIR-SEPARATE-GROUPS and other such. + - Better dir file merging. + - Steal interface ideas from Lynx: TAB for navigating to next link + within a page, number links, etc. + - q within help should quit help like C-x 0. + - Full-text search on all available info files. + - Incorporate an X-based viewer, perhaps tkinfo: + http://www.math.ucsb.edu/~boldt/tkinfo/. + - Perhaps process Texinfo files directly instead of converting to Info: + ftp://ftp.cs.berkeley.edu/ucb/people/phelps/tcltk/tkman.tar.Z + + ftp://ftp.cs.berkeley.edu/ucb/people/phelps/tcltk/rman.tar.Z + + Tcl/Tk 8.0 from ftp.smli.com in the /pub/tcl directory. + From: phelps@ecstasy.CS.Berkeley.EDU (Tom Phelps) -* @exercise/@answer command for, e.g., gawk. - -* @figure. - -* HTML output in makeinfo. - -* Include a complete functional summary, a la a reference card, in the manual. - -* Use @ as the escape character, and Texinfo syntax generally, in the - table of contents, aux, and index files. Eliminate all the crazy - redefinitions of every Texinfo command (which lists always seem to be - incomplete). - -* Improve the manuals for makeinfo, standalone info, etc. +* Install-info: + - be able to copy the info file to compile-time $(infodir), to + simplify by-hand installation. diff --git a/gnu/usr.bin/texinfo/acconfig.h b/gnu/usr.bin/texinfo/acconfig.h new file mode 100644 index 00000000000..6c34c33acc2 --- /dev/null +++ b/gnu/usr.bin/texinfo/acconfig.h @@ -0,0 +1,51 @@ +/* acconfig.h + This file is in the public domain. + + Descriptive text for the C preprocessor macros that + the distributed Autoconf macros can define. + No software package will use all of them; autoheader copies the ones + your configure.in uses into your configuration header file templates. + + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). Although this order + can split up related entries, it makes it easier to check whether + a given entry is in the file. + + Leave the following blank line there!! Autoheader needs it. */ + + +@TOP@ + +/* Define to 1 if NLS is requested. */ +#undef ENABLE_NLS + +/* Define as 1 if you have catgets and don't want to use GNU gettext. */ +#undef HAVE_CATGETS + +/* Define as 1 if you have gettext and don't want to use GNU gettext. */ +#undef HAVE_GETTEXT + +/* Define if your locale.h file contains LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define as 1 if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define to the name of the distribution. */ +#undef PACKAGE + +/* Define to the version of the distribution. */ +#undef VERSION + +@BOTTOM@ + +/* For gettext (NLS) */ +#include <libintl.h> +#define _(String) gettext (String) +#define N_(String) (String) + + +/* Leave that blank line there!! Autoheader needs it. + If you're adding to this file, keep in mind: + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). */ diff --git a/gnu/usr.bin/texinfo/aclocal.m4 b/gnu/usr.bin/texinfo/aclocal.m4 new file mode 100644 index 00000000000..221870ef739 --- /dev/null +++ b/gnu/usr.bin/texinfo/aclocal.m4 @@ -0,0 +1,464 @@ +dnl aclocal.m4 generated automatically by aclocal 1.2 + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<<am_indx=1 +for am_file in <<$1>>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AM_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") +AC_DEFINE_UNQUOTED(VERSION, "$VERSION")) +AM_SANITY_CHECK +AC_ARG_PROGRAM +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_PROG_MAKE_SET]) + + +# serial 1 + +AC_DEFUN(AM_PROG_INSTALL, +[AC_REQUIRE([AC_PROG_INSTALL]) +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' +AC_SUBST(INSTALL_SCRIPT)dnl +]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$@" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper <drepper@cygnus.com>, 1995. + +# serial 2 + +AC_DEFUN(AM_WITH_NLS, + [AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + USE_INCLUDED_LIBINTL=no + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + AC_DEFINE(ENABLE_NLS) + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If gettext or catgets are available (in this order) we + dnl use this. Else we have to fall back to GNU NLS library. + dnl catgets is only used if permitted by option --with-catgets. + nls_cv_header_intl= + nls_cv_header_libgt= + CATOBJEXT=NONE + + AC_CHECK_HEADER(libintl.h, + [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, + [AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")], + gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) + + if test "$gt_cv_func_gettext_libc" != "yes"; then + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CACHE_CHECK([for gettext in libintl], + gt_cv_func_gettext_libintl, + [AC_TRY_LINK([], [return (int) gettext ("")], + gt_cv_func_gettext_libintl=yes, + gt_cv_func_gettext_libintl=no)])]) + fi + + if test "$gt_cv_func_gettext_libc" = "yes" \ + || test "$gt_cv_func_gettext_libintl" = "yes"; then + AC_DEFINE(HAVE_GETTEXT) + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + AC_CHECK_FUNCS(dcgettext) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + INSTOBJEXT=.mo + fi + fi + ]) + + if test "$CATOBJEXT" = "NONE"; then + AC_MSG_CHECKING([whether catgets can be used]) + AC_ARG_WITH(catgets, + [ --with-catgets use catgets functions if available], + nls_cv_use_catgets=$withval, nls_cv_use_catgets=no) + AC_MSG_RESULT($nls_cv_use_catgets) + + if test "$nls_cv_use_catgets" = "yes"; then + dnl No gettext in C library. Try catgets next. + AC_CHECK_LIB(i, main) + AC_CHECK_FUNC(catgets, + [AC_DEFINE(HAVE_CATGETS) + INTLOBJS="\$(CATOBJS)" + AC_PATH_PROG(GENCAT, gencat, no)dnl + if test "$GENCAT" != "no"; then + AC_PATH_PROG(GMSGFMT, gmsgfmt, no) + if test "$GMSGFMT" = "no"; then + AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no) + fi + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.cat + INSTOBJEXT=.cat + DATADIRNAME=lib + INTLDEPS="../intl/libintl.a" + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi]) + fi + fi + + if test "$CATOBJEXT" = "NONE"; then + dnl Neither gettext nor catgets in included in the C library. + dnl Fall back on GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_SUBST(MSGFMT) + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INSTOBJEXT=.mo + DATADIRNAME=share + INTLDEPS="../intl/libintl.a" + INTLLIBS=$INTLDEPS + LIBS=`echo $LIBS | sed -e 's/-lintl//'` + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + else + DATADIRNAME=share + nls_cv_header_intl=intl/libintl.h + nls_cv_header_libgt=intl/libgettext.h + fi + + # If this is used in GNU gettext we have to set USE_NLS to `yes' + # because some of the sources are only built for this goal. + if test "$PACKAGE" = gettext; then + USE_NLS=yes + USE_INCLUDED_LIBINTL=yes + fi + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLDEPS) + AC_SUBST(INTLLIBS) + AC_SUBST(INTLOBJS) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +AC_DEFUN(AM_GNU_GETTEXT, + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ +unistd.h values.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + if test "${ac_cv_func_stpcpy+set}" != "set"; then + AC_CHECK_FUNCS(stpcpy) + fi + if test "${ac_cv_func_stpcpy}" = "yes"; then + AC_DEFINE(HAVE_STPCPY) + fi + + AM_LC_MESSAGES + AM_WITH_NLS + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl Determine which catalog format we have (if any is needed) + dnl For now we know about two different formats: + dnl Linux libc-5 and the normal X/Open format + test -d intl || mkdir intl + if test "$CATOBJEXT" = ".cat"; then + AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) + + dnl Transform the SED scripts while copying because some dumb SEDs + dnl cannot handle comments. + sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed + fi + dnl po2tbl.sed is always needed. + sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ + $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed + + dnl In the intl/Makefile.in we have a special dependency which makes + dnl only sense for gettext. We comment this out for non-gettext + dnl packages. + if test "$PACKAGE" = "gettext"; then + GT_NO="#NO#" + GT_YES= + else + GT_NO= + GT_YES="#YES#" + fi + AC_SUBST(GT_NO) + AC_SUBST(GT_YES) + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test $ac_aux_dir; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z $MKINSTALLDIRS; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl *** For now the libtool support in intl/Makefile is not for real. + l= + AC_SUBST(l) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper <drepper@cygnus.com>, 1996. + +# serial 1 + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN(AM_PATH_PROG_WITH_TEST, +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# Check whether LC_MESSAGES is available in <locale.h>. +# Ulrich Drepper <drepper@cygnus.com>, 1995. + +# serial 1 + +AC_DEFUN(AM_LC_MESSAGES, + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES) + fi + fi]) + diff --git a/gnu/usr.bin/texinfo/config.guess b/gnu/usr.bin/texinfo/config.guess new file mode 100644 index 00000000000..a33514f2462 --- /dev/null +++ b/gnu/usr.bin/texinfo/config.guess @@ -0,0 +1,713 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. +# +# This 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 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 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. + +# Written by Per Bothner <bothner@cygnus.com>. +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + alpha:OSF1:*:*) + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'` + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:NetBSD:*:*) + echo m68k-cbm-netbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-cbm-openbsd${UNAME_RELEASE} + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:*|MIS*:OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:NetBSD:*:*) + echo m68k-atari-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-atari-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:NetBSD:*:*) + echo m68k-sun-netbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-sun-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:NetBSD:*:*) + echo m68k-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-apple-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >dummy.c + int main (argc, argv) int argc; char **argv; { + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + ${CC-cc} dummy.c -o dummy \ + && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ + -o ${TARGET_BINARY_INTERFACE}x = x ] ; then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[3478]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;; + 9000/8?? ) HP_ARCH=hppa1.0 ;; + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp3[0-9][05]:NetBSD:*:*) + echo m68k-hp-netbsd${UNAME_RELEASE} + exit 0 ;; + hp3[0-9][05]:OpenBSD:*:*) + echo m68k-hp-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:NetBSD:*:*) + echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo i386-pc-cygwin32 + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin32 + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,-.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. + ld_help_string=`ld --help 2>&1` + if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then + echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then + echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then + echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then + echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then + echo "powerpc-unknown-linux-gnu" ; exit 0 + elif test "${UNAME_MACHINE}" = "alpha" ; then + echo alpha-unknown-linux-gnu ; exit 0 + elif test "${UNAME_MACHINE}" = "sparc" ; then + echo sparc-unknown-linux-gnu ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >dummy.c <<EOF +main(argc, argv) +int argc; +char *argv[]; +{ +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + else + # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us + # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout. + test ! -d /usr/lib/ldscripts/. \ + && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + # Determine whether the default compiler is a.out or elf + cat >dummy.c <<EOF +main(argc, argv) +int argc; +char *argv[]; +{ +#ifdef __ELF__ + printf ("%s-pc-linux-gnu\n", argv[1]); +#else + printf ("%s-pc-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 +rm -f dummy.c dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/gnu/usr.bin/texinfo/config.h.in b/gnu/usr.bin/texinfo/config.h.in new file mode 100644 index 00000000000..94c0061d524 --- /dev/null +++ b/gnu/usr.bin/texinfo/config.h.in @@ -0,0 +1,248 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ +/* acconfig.h + This file is in the public domain. + + Descriptive text for the C preprocessor macros that + the distributed Autoconf macros can define. + No software package will use all of them; autoheader copies the ones + your configure.in uses into your configuration header file templates. + + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). Although this order + can split up related entries, it makes it easier to check whether + a given entry is in the file. + + Leave the following blank line there!! Autoheader needs it. */ + + + +/* Define if using alloca.c. */ +#undef C_ALLOCA + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define if you have alloca, as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ +#undef HAVE_ALLOCA_H + +/* Define if you don't have vprintf but do have _doprnt. */ +#undef HAVE_DOPRNT + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define if you have the vprintf function. */ +#undef HAVE_VPRINTF + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define if on MINIX. */ +#undef _MINIX + +/* Define to `long' if <sys/types.h> doesn't define. */ +#undef off_t + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +#undef _POSIX_1_SOURCE + +/* Define if you need to in order for stat and other things to work. */ +#undef _POSIX_SOURCE + +/* Define as the return type of signal handlers (int or void). */ +#undef RETSIGTYPE + +/* Define if the setvbuf function takes the buffering type as its second + argument and the buffer pointer as the third, as on System V + before release 3. */ +#undef SETVBUF_REVERSED + +/* Define to `unsigned' if <sys/types.h> doesn't define. */ +#undef size_t + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#undef STACK_DIRECTION + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your <sys/time.h> declares struct tm. */ +#undef TM_IN_SYS_TIME + +/* Define to 1 if NLS is requested. */ +#undef ENABLE_NLS + +/* Define as 1 if you have catgets and don't want to use GNU gettext. */ +#undef HAVE_CATGETS + +/* Define as 1 if you have gettext and don't want to use GNU gettext. */ +#undef HAVE_GETTEXT + +/* Define if your locale.h file contains LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define as 1 if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define to the name of the distribution. */ +#undef PACKAGE + +/* Define to the version of the distribution. */ +#undef VERSION + +/* Define if you have the __argz_count function. */ +#undef HAVE___ARGZ_COUNT + +/* Define if you have the __argz_next function. */ +#undef HAVE___ARGZ_NEXT + +/* Define if you have the __argz_stringify function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define if you have the bzero function. */ +#undef HAVE_BZERO + +/* Define if you have the dcgettext function. */ +#undef HAVE_DCGETTEXT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getpagesize function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the memcpy function. */ +#undef HAVE_MEMCPY + +/* Define if you have the memmove function. */ +#undef HAVE_MEMMOVE + +/* Define if you have the memset function. */ +#undef HAVE_MEMSET + +/* Define if you have the munmap function. */ +#undef HAVE_MUNMAP + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the setenv function. */ +#undef HAVE_SETENV + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the setvbuf function. */ +#undef HAVE_SETVBUF + +/* Define if you have the sigprocmask function. */ +#undef HAVE_SIGPROCMASK + +/* Define if you have the sigsetmask function. */ +#undef HAVE_SIGSETMASK + +/* Define if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strchr function. */ +#undef HAVE_STRCHR + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the strerror function. */ +#undef HAVE_STRERROR + +/* Define if you have the <argz.h> header file. */ +#undef HAVE_ARGZ_H + +/* Define if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the <locale.h> header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the <malloc.h> header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the <nl_types.h> header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the <pwd.h> header file. */ +#undef HAVE_PWD_H + +/* Define if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define if you have the <sys/fcntl.h> header file. */ +#undef HAVE_SYS_FCNTL_H + +/* Define if you have the <sys/file.h> header file. */ +#undef HAVE_SYS_FILE_H + +/* Define if you have the <sys/ptem.h> header file. */ +#undef HAVE_SYS_PTEM_H + +/* Define if you have the <sys/time.h> header file. */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the <sys/ttold.h> header file. */ +#undef HAVE_SYS_TTOLD_H + +/* Define if you have the <sys/wait.h> header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have the <termcap.h> header file. */ +#undef HAVE_TERMCAP_H + +/* Define if you have the <termio.h> header file. */ +#undef HAVE_TERMIO_H + +/* Define if you have the <termios.h> header file. */ +#undef HAVE_TERMIOS_H + +/* Define if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the <values.h> header file. */ +#undef HAVE_VALUES_H + +/* Define if you have the bsd library (-lbsd). */ +#undef HAVE_LIBBSD + +/* Define if you have the i library (-li). */ +#undef HAVE_LIBI + +/* For gettext (NLS) */ +#include <libintl.h> +#define _(String) gettext (String) +#define N_(String) (String) + + +/* Leave that blank line there!! Autoheader needs it. + If you're adding to this file, keep in mind: + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). */ diff --git a/gnu/usr.bin/texinfo/config.sub b/gnu/usr.bin/texinfo/config.sub new file mode 100644 index 00000000000..cd342535401 --- /dev/null +++ b/gnu/usr.bin/texinfo/config.sub @@ -0,0 +1,939 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This 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 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 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. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ + | arme[lb] | pyramid \ + | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \ + | alpha | we32k | ns16k | clipper | i370 | sh \ + | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ + | pdp11 | mips64el | mips64orion | mips64orionel \ + | sparc | sparclet | sparclite | sparc64) + basic_machine=$basic_machine-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[3456]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ + | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ + | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ + | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ + | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* | f301-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigados) + basic_machine=m68k-cbm + os=-amigados + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[3456]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[3456]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[3456]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[3456]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + np1) + basic_machine=np1-gould + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5) + basic_machine=i586-intel + ;; + pentiumpro | p6) + basic_machine=i686-intel + ;; + pentium-* | p5-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + k5) + # We don't have specific support for AMD's K5 yet, so just call it a Pentium + basic_machine=i586-amd + ;; + nexen) + # We don't have specific support for Nexgen yet, so just call it a Pentium + basic_machine=i586-nexgen + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + mips) + if [ x$os = x-linux ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware* | svr4*) + os=-sysv4 + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -linux-gnu* | -uxpv*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -xenix) + os=-xenix + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-ibm) + os=-aix + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigados + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -hpux*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/gnu/usr.bin/texinfo/doc/Makefile.am b/gnu/usr.bin/texinfo/doc/Makefile.am new file mode 100644 index 00000000000..68efe846abb --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/Makefile.am @@ -0,0 +1,56 @@ +## Makefile.am for texinfo/emacs. +## $Id: Makefile.am,v 1.1 1997/08/01 22:01:12 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +info_TEXINFOS = info-stnd.texi info.texi texinfo.texi + +# Use the makeinfo built in our distribution. +MAKEINFO = ../makeinfo/makeinfo + +# Include our texinfo.tex, not Automake's. +EXTRA_DIST = macro.texi userdoc.texi epsf.tex texinfo.tex + +# We try to discover this via configure just to give a better help message. +TEXMF = @TEXMF@ + +install-data-local: + @echo "WARNING: You must install texinfo.tex and epsf.tex manually," + @echo "WARNING: perhaps in $(TEXMF)/tex/texinfo/" + @echo "WARNING: and $(TEXMF)/tex/generic/dvips/ respectively." + @echo "WARNING: See doc/README for some considerations." + +# Do not create info files for distribution. +dist-info: + +# Do not try to build the info files in $(srcdir), +# since we don't distribute them. +.texi.info: + $(MAKEINFO) -I$(srcdir) `echo $< | sed 's,.*/,,'` +texinfo: $(srcdir)/texinfo.texi + $(MAKEINFO) -I$(srcdir) texinfo.texi + +# Do not try to install them from $(srcdir). +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(infodir) + @for file in $(INFO_DEPS); do \ + d=.; \ + for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ + if test -f $$d/$$ifile; then \ + echo " $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile"; \ + $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile; \ + else : ; fi; \ + done; \ + done + @$(POST_INSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ + for file in $(INFO_DEPS); do \ + echo " install-info --info-dir=$(infodir) $(infodir)/$$file";\ + install-info --info-dir=$(infodir) $(infodir)/$$file || :;\ + done; \ + else : ; fi + + +# Remove them at make distclean. +distclean-aminfo: + rm -f texinfo texinfo-* info*.info* diff --git a/gnu/usr.bin/texinfo/doc/Makefile.in b/gnu/usr.bin/texinfo/doc/Makefile.in new file mode 100644 index 00000000000..ae5d508ca5e --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/Makefile.in @@ -0,0 +1,303 @@ +# Makefile.in generated automatically by automake 1.2 from Makefile.am + +# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = true +PRE_INSTALL = true +POST_INSTALL = true +NORMAL_UNINSTALL = true +PRE_UNINSTALL = true +POST_UNINSTALL = true +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +GENCAT = @GENCAT@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GT_NO = @GT_NO@ +GT_YES = @GT_YES@ +INSTOBJEXT = @INSTOBJEXT@ +INTLDEPS = @INTLDEPS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +PACKAGE = @PACKAGE@ +POFILES = @POFILES@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +TERMLIBS = @TERMLIBS@ +TEXCONFIG = @TEXCONFIG@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +l = @l@ + +info_TEXINFOS = info-stnd.texi info.texi texinfo.texi + +# Use the makeinfo built in our distribution. +MAKEINFO = ../makeinfo/makeinfo + +# Include our texinfo.tex, not Automake's. +EXTRA_DIST = macro.texi userdoc.texi epsf.tex texinfo.tex + +# We try to discover this via configure just to give a better help message. +TEXMF = @TEXMF@ +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +TEXI2DVI = texi2dvi +TEXINFO_TEX = $(srcdir)/texinfo.tex +INFO_DEPS = info-stnd.info info.info texinfo +DVIS = info-stnd.dvi info.dvi texinfo.dvi +TEXINFOS = info-stnd.texi info.texi texinfo.texi +DIST_COMMON = README $(info_TEXINFOS) Makefile.am Makefile.in \ +texinfo.tex + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP = --best +default: all + +.SUFFIXES: +.SUFFIXES: .dvi .info .ps .texi .texinfo +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +info-stnd.info: info-stnd.texi +info-stnd.dvi: info-stnd.texi + + +info.info: info.texi $(info_TEXINFOS) +info.dvi: info.texi $(info_TEXINFOS) + + +texinfo: texinfo.texi +texinfo.dvi: texinfo.texi + + +DVIPS = dvips + +.texi.dvi: + TEXINPUTS=$(srcdir):$$TEXINPUTS \ + MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< + +.texi: + @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] + cd $(srcdir) \ + && $(MAKEINFO) `echo $< | sed 's,.*/,,'` + +.texinfo.info: + @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] + cd $(srcdir) \ + && $(MAKEINFO) `echo $< | sed 's,.*/,,'` + +.texinfo: + @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] + cd $(srcdir) \ + && $(MAKEINFO) `echo $< | sed 's,.*/,,'` + +.texinfo.dvi: + TEXINPUTS=$(srcdir):$$TEXINPUTS \ + MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< +.dvi.ps: + $(DVIPS) $< -o $@ + +uninstall-info: + $(PRE_UNINSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ + ii=yes; \ + else ii=; fi; \ + for file in $(INFO_DEPS); do \ + test -z $ii || install-info --info-dir=$(infodir) --remove $$file; \ + done + $(NORMAL_UNINSTALL) + for file in $(INFO_DEPS); do \ + (cd $(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ + done + +mostlyclean-aminfo: + rm -f info-stnd.aux info-stnd.cp info-stnd.cps info-stnd.dvi \ + info-stnd.fn info-stnd.fns info-stnd.ky info-stnd.log \ + info-stnd.pg info-stnd.toc info-stnd.tp info-stnd.tps \ + info-stnd.vr info-stnd.vrs info-stnd.op info-stnd.tr \ + info-stnd.cv info.aux info.cp info.cps info.dvi info.fn \ + info.fns info.ky info.log info.pg info.toc info.tp info.tps \ + info.vr info.vrs info.op info.tr info.cv texinfo.aux \ + texinfo.cp texinfo.cps texinfo.dvi texinfo.fn texinfo.fns \ + texinfo.ky texinfo.log texinfo.pg texinfo.toc texinfo.tp \ + texinfo.tps texinfo.vr texinfo.vrs texinfo.op texinfo.tr \ + texinfo.cv + +clean-aminfo: + +distclean-aminfo: + +maintainer-clean-aminfo: + for i in $(INFO_DEPS); do rm -f `eval echo $$i*`; done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file; \ + done + $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info +info: $(INFO_DEPS) +dvi: $(DVIS) +check: all + $(MAKE) +installcheck: +install-exec: + @$(NORMAL_INSTALL) + +install-data: install-info-am install-data-local + @$(NORMAL_INSTALL) + +install: install-exec install-data all + @: + +uninstall: uninstall-info + +all: Makefile $(INFO_DEPS) + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install +installdirs: + $(mkinstalldirs) $(infodir) + + +mostlyclean-generic: + test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + rm -f Makefile $(DISTCLEANFILES) + rm -f config.cache config.log stamp-h stamp-h[0-9]* + test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean: mostlyclean-aminfo mostlyclean-generic + +clean: clean-aminfo clean-generic mostlyclean + +distclean: distclean-aminfo distclean-generic clean + rm -f config.status + +maintainer-clean: maintainer-clean-aminfo maintainer-clean-generic \ + distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +.PHONY: default install-info-am uninstall-info mostlyclean-aminfo \ +distclean-aminfo clean-aminfo maintainer-clean-aminfo tags distdir info \ +dvi installcheck install-exec install-data install uninstall all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +install-data-local: + @echo "WARNING: You must install texinfo.tex and epsf.tex manually," + @echo "WARNING: perhaps in $(TEXMF)/tex/texinfo/" + @echo "WARNING: and $(TEXMF)/tex/generic/dvips/ respectively." + @echo "WARNING: See doc/README for some considerations." + +# Do not create info files for distribution. +dist-info: + +# Do not try to build the info files in $(srcdir), +# since we don't distribute them. +.texi.info: + $(MAKEINFO) -I$(srcdir) `echo $< | sed 's,.*/,,'` +texinfo: $(srcdir)/texinfo.texi + $(MAKEINFO) -I$(srcdir) texinfo.texi + +# Do not try to install them from $(srcdir). +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(infodir) + @for file in $(INFO_DEPS); do \ + d=.; \ + for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ + if test -f $$d/$$ifile; then \ + echo " $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile"; \ + $(INSTALL_DATA) $$d/$$ifile $(infodir)/$$ifile; \ + else : ; fi; \ + done; \ + done + @$(POST_INSTALL) + @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ + for file in $(INFO_DEPS); do \ + echo " install-info --info-dir=$(infodir) $(infodir)/$$file";\ + install-info --info-dir=$(infodir) $(infodir)/$$file || :;\ + done; \ + else : ; fi + +# Remove them at make distclean. +distclean-aminfo: + rm -f texinfo texinfo-* info*.info* + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gnu/usr.bin/texinfo/doc/README b/gnu/usr.bin/texinfo/doc/README new file mode 100644 index 00000000000..e7518e6be77 --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/README @@ -0,0 +1,26 @@ +This directory contains documentation on the Texinfo system and the TeX +sources needed to process Texinfo sources. + +The .tex files are not installed automatically because TeX installations +vary so widely. Installing them in the wrong place would give a false +sense of security. So, you should simply cp *.tex to the appropriate +place. If your installation follows the TeX Directory Structure +standard (http://www.tug.org/tds/), this will be the directory +<texmf>/tex/texinfo/ for texinfo.tex and <texmf>/tex/plain/dvips/ for +epsf.tex. If you use the default installation paths, <texmf> will be +/usr/local/share/texmf. If you have teTeX, you can find <texmf> by +running: + texconfig confall | grep \^TEXMF= +(The configure script tries to do this for you.) + +You can get the latest texinfo.tex from +ftp://ftp.tug.org/tex/texinfo.tex +ftp://ftp.cs.umb.edu/pub/tex/texinfo.tex +or on the FSF machines in /home/gd/gnu/doc/texinfo.tex. +If you have problems with the version in this distribution, please check +for a newer version. + +epsf.tex comes with dvips distributions, and you may already have it +installed. The version here is functionally identical but slightly +nicer than the one in dvips574. The changes have been sent to the +epsf.tex maintainer. diff --git a/gnu/usr.bin/texinfo/doc/epsf.tex b/gnu/usr.bin/texinfo/doc/epsf.tex new file mode 100644 index 00000000000..4f9dded4fdd --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/epsf.tex @@ -0,0 +1,546 @@ +%%% ==================================================================== +%%% This file is freely redistributable and placed into the +%%% public domain by Tomas Rokicki. +%%% @TeX-file{ +%%% author = "Tom Rokicki", +%%% version = "2.7k", +%%% date = "19 July 1997", +%%% time = "10:00:05 MDT", +%%% filename = "epsf.tex", +%%% address = "Tom Rokicki +%%% Box 2081 +%%% Stanford, CA 94309 +%%% USA", +%%% telephone = "+1 415 855 9989", +%%% email = "rokicki@cs.stanford.edu (Internet)", +%%% codetable = "ISO/ASCII", +%%% keywords = "PostScript, TeX", +%%% supported = "yes", +%%% abstract = "This file contains macros to support the inclusion +%%% of Encapsulated PostScript files in TeX documents.", +%%% docstring = "This file contains TeX macros to include an +%%% Encapsulated PostScript graphic. It works +%%% by finding the bounding box comment, +%%% calculating the correct scale values, and +%%% inserting a vbox of the appropriate size at +%%% the current position in the TeX document. +%%% +%%% To use, simply say +%%% +%%% \input epsf % somewhere early on in your TeX file +%%% +%%% % then where you want to insert a vbox for a figure: +%%% \epsfbox{filename.ps} +%%% +%%% Alternatively, you can supply your own +%%% bounding box by +%%% +%%% \epsfbox[0 0 30 50]{filename.ps} +%%% +%%% This will not read in the file, and will +%%% instead use the bounding box you specify. +%%% +%%% The effect will be to typeset the figure as +%%% a TeX box, at the point of your \epsfbox +%%% command. By default, the graphic will have +%%% its `natural' width (namely the width of +%%% its bounding box, as described in +%%% filename.ps). The TeX box will have depth +%%% zero. +%%% +%%% You can enlarge or reduce the figure by +%%% saying +%%% +%%% \epsfxsize=<dimen> \epsfbox{filename.ps} +%%% or +%%% \epsfysize=<dimen> \epsfbox{filename.ps} +%%% +%%% instead. Then the width of the TeX box will +%%% be \epsfxsize and its height will be scaled +%%% proportionately (or the height will be +%%% \epsfysize and its width will be scaled +%%% proportionately). +%%% +%%% The width (and height) is restored to zero +%%% after each use, so \epsfxsize or \epsfysize +%%% must be specified before EACH use of +%%% \epsfbox. +%%% +%%% A more general facility for sizing is +%%% available by defining the \epsfsize macro. +%%% Normally you can redefine this macro to do +%%% almost anything. The first parameter is +%%% the natural x size of the PostScript +%%% graphic, the second parameter is the +%%% natural y size of the PostScript graphic. +%%% It must return the xsize to use, or 0 if +%%% natural scaling is to be used. Common uses +%%% include: +%%% +%%% \epsfxsize % just leave the old value alone +%%% 0pt % use the natural sizes +%%% #1 % use the natural sizes +%%% \hsize % scale to full width +%%% 0.5#1 % scale to 50% of natural size +%%% \ifnum #1>\hsize\hsize\else#1\fi +%%% % smaller of natural, hsize +%%% +%%% If you want TeX to report the size of the +%%% figure (as a message on your terminal when +%%% it processes each figure), say +%%% `\epsfverbosetrue'. +%%% +%%% If you only want to get the bounding box +%%% extents, without producing any output boxes +%%% or \special{}, then say +%%% \epsfgetbb{filename}. The extents will be +%%% saved in the macros \epsfllx \epsflly +%%% \epsfurx \epsfury in PostScript units of +%%% big points. +%%% +%%% Revision history: +%%% +%%% --------------------------------------------- +%%% epsf.tex macro file: +%%% Originally written by Tomas Rokicki of +%%% Radical Eye Software, 29 Mar 1989. +%%% +%%% --------------------------------------------- +%%% Revised by Don Knuth, 3 Jan 1990. +%%% +%%% --------------------------------------------- +%%% Revised by Tomas Rokicki, 18 Jul 1990. +%%% Accept bounding boxes with no space after +%%% the colon. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 03 Dec 1991 [2.0]. +%%% Add version number and date typeout. +%%% +%%% Use \immediate\write16 instead of \message +%%% to ensure output on new line. +%%% +%%% Handle nested EPS files. +%%% +%%% Handle %%BoundingBox: (atend) lines. +%%% +%%% Do not quit when blank lines are found. +%%% +%%% Add a few percents to remove generation of +%%% spurious blank space. +%%% +%%% Move \special output to +%%% \epsfspecial{filename} so that other macro +%%% packages can input this one, then change +%%% the definition of \epsfspecial to match +%%% another DVI driver. +%%% +%%% Move size computation to \epsfsetsize which +%%% can be called by the user; the verbose +%%% output of the bounding box and scaled width +%%% and height happens here. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 05 May 1992 [2.1]. +%%% Wrap \leavevmode\hbox{} around \vbox{} with +%%% the \special so that \epsffile{} can be +%%% used inside \begin{center}...\end{center} +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 09 Dec 1992 [2.2]. +%%% Introduce \epsfshow{true,false} and +%%% \epsfframe{true,false} macros; the latter +%%% suppresses the insertion of the PostScript, +%%% and instead just creates an empty box, +%%% which may be handy for rapid prototyping. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 14 Dec 1992 [2.3]. +%%% Add \epsfshowfilename{true,false}. When +%%% true, and \epsfshowfalse is specified, the +%%% PostScript file name will be displayed +%%% centered in the figure box. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 20 June 1993 [2.4]. +%%% Remove non-zero debug setting of \epsfframemargin, +%%% and change margin handling to preserve EPS image +%%% size and aspect ratio, so that the actual +%%% box is \epsfxsize+\epsfframemargin wide by +%%% \epsfysize+\epsfframemargin high. +%%% Reduce output of \epsfshowfilenametrue to +%%% just the bare file name. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 13 July 1993 [2.5]. +%%% Add \epsfframethickness for control of +%%% \epsfframe frame lines. +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 02 July 1996 [2.6] +%%% Add missing initialization \epsfatendfalse; +%%% the lack of this resulted in the wrong +%%% BoundingBox being picked up, mea culpa, sigh... +%%% --------------------------------------------- +%%% +%%% --------------------------------------------- +%%% Revised by Nelson H. F. Beebe +%%% <beebe@math.utah.edu>, 25 October 1996 [2.7] +%%% Update to match changes in from dvips 5-600 +%%% distribution: new user-accessible macros: +%%% \epsfclipon, \epsfclipoff, \epsfdrafton, +%%% \epsfdraftoff, change \empty to \epsfempty. +%%% --------------------------------------------- +%%% +%%% Modified to avoid verbosity, give help. +%%% --kb@cs.umb.edu, for Texinfo. +%%% } +%%% ==================================================================== +% +\ifx\epsfannounce\undefined \def\epsfannounce{\immediate\write16}\fi + \epsfannounce{This is `epsf.tex' v2.7k <10 July 1997>}% +% +\newread\epsffilein % file to \read +\newif\ifepsfatend % need to scan to LAST %%BoundingBox comment? +\newif\ifepsfbbfound % success? +\newif\ifepsfdraft % use draft mode? +\newif\ifepsffileok % continue looking for the bounding box? +\newif\ifepsfframe % frame the bounding box? +\newif\ifepsfshow % show PostScript file, or just bounding box? +\epsfshowtrue % default is to display PostScript file +\newif\ifepsfshowfilename % show the file name if \epsfshowfalse specified? +\newif\ifepsfverbose % report what you're making? +\newdimen\epsfframemargin % margin between box and frame +\newdimen\epsfframethickness % thickness of frame rules +\newdimen\epsfrsize % vertical size before scaling +\newdimen\epsftmp % register for arithmetic manipulation +\newdimen\epsftsize % horizontal size before scaling +\newdimen\epsfxsize % horizontal size after scaling +\newdimen\epsfysize % vertical size after scaling +\newdimen\pspoints % conversion factor +% +\pspoints = 1bp % Adobe points are `big' +\epsfxsize = 0pt % default value, means `use natural size' +\epsfysize = 0pt % ditto +\epsfframemargin = 0pt % default value: frame box flush around picture +\epsfframethickness = 0.4pt % TeX's default rule thickness +% +\def\epsfbox#1{\global\def\epsfllx{72}\global\def\epsflly{72}% + \global\def\epsfurx{540}\global\def\epsfury{720}% + \def\lbracket{[}\def\testit{#1}\ifx\testit\lbracket + \let\next=\epsfgetlitbb\else\let\next=\epsfnormal\fi\next{#1}}% +% +% We use \epsfgetlitbb if the user specified an explicit bounding box, +% and \epsfnormal otherwise. Because \epsfgetbb can be called +% separately to retrieve the bounding box, we move the verbose +% printing the bounding box extents and size on the terminal to +% \epsfstatus. Therefore, when the user provided the bounding box, +% \epsfgetbb will not be called, so we must call \epsfsetsize and +% \epsfstatus ourselves. +% +\def\epsfgetlitbb#1#2 #3 #4 #5]#6{% + \epsfgrab #2 #3 #4 #5 .\\% + \epsfsetsize + \epsfstatus{#6}% + \epsfsetgraph{#6}% +}% +% +\def\epsfnormal#1{% + \epsfgetbb{#1}% + \epsfsetgraph{#1}% +}% +% +\newhelp\epsfnoopenhelp{The PostScript image file must be findable by +TeX, i.e., somewhere in the TEXINPUTS (or equivalent) path.}% +% +\def\epsfgetbb#1{% +% +% The first thing we need to do is to open the +% PostScript file, if possible. +% + \openin\epsffilein=#1 + \ifeof\epsffilein + \errhelp = \epsfnoopenhelp + \errmessage{Could not open file #1, ignoring it}% + \else %process the file + {% %start a group to contain catcode changes + % Make all special characters, except space, to be of type + % `other' so we process the file in almost verbatim mode + % (TeXbook, p. 344). + \chardef\other=12 + \def\do##1{\catcode`##1=\other}% + \dospecials + \catcode`\ =10 + \epsffileoktrue %true while we are looping + \epsfatendfalse %[02-Jul-1996]: add forgotten initialization + \loop %reading lines from the EPS file + \read\epsffilein to \epsffileline + \ifeof\epsffilein %then no more input + \epsffileokfalse %so set completion flag + \else %otherwise process one line + \expandafter\epsfaux\epsffileline:. \\% + \fi + \ifepsffileok + \repeat + \ifepsfbbfound + \else + \ifepsfverbose + \immediate\write16{No BoundingBox comment found in % + file #1; using defaults}% + \fi + \fi + }% %end catcode changes + \closein\epsffilein + \fi %end of file processing + \epsfsetsize %compute size parameters + \epsfstatus{#1}% +}% +% +% Clipping control: +\def\epsfclipon{\def\epsfclipstring{ clip}}% +\def\epsfclipoff{\def\epsfclipstring{\ifepsfdraft\space clip\fi}}% +\epsfclipoff % default for dvips is OFF +% +% The special that is emitted by \epsfsetgraph comes from this macro. +% It is defined separately to allow easy customization by other +% packages that first \input epsf.tex, then redefine \epsfspecial. +% This macro is invoked in the lower-left corner of a box of the +% width and height determined from the arguments to \epsffile, or +% from the %%BoundingBox in the EPS file itself. +% +% This version is for dvips: +\def\epsfspecial#1{% + \epsftmp=10\epsfxsize + \divide\epsftmp\pspoints + \ifnum\epsfrsize=0\relax + \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space + llx=\epsfllx\space + lly=\epsflly\space + urx=\epsfurx\space + ury=\epsfury\space + rwi=\number\epsftmp + \epsfclipstring + }% + \else + \epsfrsize=10\epsfysize + \divide\epsfrsize\pspoints + \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space + llx=\epsfllx\space + lly=\epsflly\space + urx=\epsfurx\space + ury=\epsfury\space + rwi=\number\epsftmp + rhi=\number\epsfrsize + \epsfclipstring + }% + \fi +}% +% +% \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331. +% but modified to set the box width to the natural width, rather +% than the line width, and to include space for margins and rules +\def\epsfframe#1% +{% + \leavevmode % so we can put this inside + % a centered environment + \setbox0 = \hbox{#1}% + \dimen0 = \wd0 % natural width of argument + \advance \dimen0 by 2\epsfframemargin % plus width of 2 margins + \advance \dimen0 by 2\epsfframethickness % plus width of 2 rule lines + \vbox + {% + \hrule height \epsfframethickness depth 0pt + \hbox to \dimen0 + {% + \hss + \vrule width \epsfframethickness + \kern \epsfframemargin + \vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }% + \kern \epsfframemargin + \vrule width \epsfframethickness + \hss + }% end hbox + \hrule height 0pt depth \epsfframethickness + }% end vbox +}% +% +\def\epsfsetgraph#1% +{% + % + % Make the vbox and stick in a \special that the DVI driver can + % parse. \vfil and \hfil are used to place the \special origin at + % the lower-left corner of the vbox. \epsfspecial can be redefined + % to produce alternate \special syntaxes. + % + \leavevmode + \hbox{% so we can put this in \begin{center}...\end{center} + \ifepsfframe\expandafter\epsfframe\fi + {\vbox to\epsfysize + {% + \ifepsfshow + % output \special{} at lower-left corner of figure box + \vfil + \hbox to \epsfxsize{\epsfspecial{#1}\hfil}% + \else + \vfil + \hbox to\epsfxsize{% + \hss + \ifepsfshowfilename + {% + \epsfframemargin=3pt % local change of margin + \epsfframe{{\tt #1}}% + }% + \fi + \hss + }% + \vfil + \fi + }% + }}% + % + % Reset \epsfxsize and \epsfysize, as documented above. + % + \global\epsfxsize=0pt + \global\epsfysize=0pt +}% +% +% Now we have to calculate the scale and offset values to use. +% First we compute the natural sizes. +% +\def\epsfsetsize +{% + \epsfrsize=\epsfury\pspoints + \advance\epsfrsize by-\epsflly\pspoints + \epsftsize=\epsfurx\pspoints + \advance\epsftsize by-\epsfllx\pspoints +% +% If `epsfxsize' is 0, we default to the natural size of the picture. +% Otherwise we scale the graph to be \epsfxsize wide. +% + \epsfxsize=\epsfsize{\epsftsize}{\epsfrsize}% + \ifnum \epsfxsize=0 + \ifnum \epsfysize=0 + \epsfxsize=\epsftsize + \epsfysize=\epsfrsize + \epsfrsize=0pt +% +% We have a sticky problem here: TeX doesn't do floating point arithmetic! +% Our goal is to compute y = rx/t. The following loop does this reasonably +% fast, with an error of at most about 16 sp (about 1/4000 pt). +% + \else + \epsftmp=\epsftsize \divide\epsftmp\epsfrsize + \epsfxsize=\epsfysize \multiply\epsfxsize\epsftmp + \multiply\epsftmp\epsfrsize \advance\epsftsize-\epsftmp + \epsftmp=\epsfysize + \loop \advance\epsftsize\epsftsize \divide\epsftmp 2 + \ifnum \epsftmp>0 + \ifnum \epsftsize<\epsfrsize + \else + \advance\epsftsize-\epsfrsize \advance\epsfxsize\epsftmp + \fi + \repeat + \epsfrsize=0pt + \fi + \else + \ifnum \epsfysize=0 + \epsftmp=\epsfrsize \divide\epsftmp\epsftsize + \epsfysize=\epsfxsize \multiply\epsfysize\epsftmp + \multiply\epsftmp\epsftsize \advance\epsfrsize-\epsftmp + \epsftmp=\epsfxsize + \loop \advance\epsfrsize\epsfrsize \divide\epsftmp 2 + \ifnum \epsftmp>0 + \ifnum \epsfrsize<\epsftsize + \else + \advance\epsfrsize-\epsftsize \advance\epsfysize\epsftmp + \fi + \repeat + \epsfrsize=0pt + \else + \epsfrsize=\epsfysize + \fi + \fi +}% +% +% Issue some status messages if the user requested them +% +\def\epsfstatus#1{% arg = filename + \ifepsfverbose + \immediate\write16{#1: BoundingBox: + llx = \epsfllx\space lly = \epsflly\space + urx = \epsfurx\space ury = \epsfury\space}% + \immediate\write16{#1: scaled width = \the\epsfxsize\space + scaled height = \the\epsfysize}% + \fi +}% +% +% We still need to define the tricky \epsfaux macro. This requires +% a couple of magic constants for comparison purposes. +% +{\catcode`\%=12 \global\let\epsfpercent=%\global\def\epsfbblit{%BoundingBox}}% +\global\def\epsfatend{(atend)}% +% +% So we're ready to check for `%BoundingBox:' and to grab the +% values if they are found. +% +% If we find a line +% +% %%BoundingBox: (atend) +% +% then we ignore it, but set a flag to force parsing all of the +% file, so the last %%BoundingBox parsed will be the one used. This +% is necessary, because EPS files can themselves contain other EPS +% files with their own %%BoundingBox comments. +% +% If we find a line +% +% %%BoundingBox: llx lly urx ury +% +% then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury. +% Then, if we have not previously parsed an (atend), we flag completion +% and can stop reading the file. Otherwise, we must keep on reading +% to end of file so that we find the values on the LAST %%BoundingBox. +\long\def\epsfaux#1#2:#3\\% +{% + \def\testit{#2}% % save second character up to just before colon + \ifx#1\epsfpercent % then first char is percent (quick test) + \ifx\testit\epsfbblit % then (slow test) we have %%BoundingBox + \epsfgrab #3 . . . \\% + \ifx\epsfllx\epsfatend % then ignore %%BoundingBox: (atend) + \global\epsfatendtrue + \else % else found %%BoundingBox: llx lly urx ury + \ifepsfatend % then keep parsing ALL %%BoundingBox lines + \else % else stop after first one parsed + \epsffileokfalse + \fi + \global\epsfbbfoundtrue + \fi + \fi + \fi +}% +% +% Here we grab the values and stuff them in the appropriate definitions. +% +\def\epsfempty{}% +\def\epsfgrab #1 #2 #3 #4 #5\\{% + \global\def\epsfllx{#1}\ifx\epsfllx\epsfempty + \epsfgrab #2 #3 #4 #5 .\\\else + \global\def\epsflly{#2}% + \global\def\epsfurx{#3}\global\def\epsfury{#4}\fi +}% +% +% We default the epsfsize macro. +% +\def\epsfsize#1#2{\epsfxsize}% +% +% Finally, another definition for compatibility with older macros. +% +\let\epsffile=\epsfbox +\endinput diff --git a/gnu/usr.bin/texinfo/doc/info-stnd.texi b/gnu/usr.bin/texinfo/doc/info-stnd.texi new file mode 100644 index 00000000000..b2d10dc3b5b --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/info-stnd.texi @@ -0,0 +1,1373 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header +@setfilename info-stnd.info +@settitle GNU Info +@set InfoProgVer 2.11 +@paragraphindent none +@footnotestyle end +@synindex vr cp +@synindex fn cp +@synindex ky cp +@comment %**end of header +@comment $Id: info-stnd.texi,v 1.1 1997/08/01 22:01:10 kstailey Exp $ + +@dircategory Texinfo documentation system +@direntry +* info program: (info-stnd). Standalone Info-reading program. +@end direntry + +@ifinfo +This file documents GNU Info, a program for viewing the on-line formatted +versions of Texinfo files. This documentation is different from the +documentation for the Info reader that is part of GNU Emacs. If you do +not know how to use Info, but have a working Info reader, you should +read that documentation first. + +Copyright @copyright{} 1992, 93, 96, 97 Free Software Foundation, Inc. + +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. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries a copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). +@end ignore + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +sections entitled ``Copying'' and ``GNU General Public License'' are +included exactly as in the original, and provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation +approved by the Free Software Foundation. +@end ifinfo + +@titlepage +@title GNU Info User's Guide +@subtitle For GNU Info version @value{InfoProgVer} +@author Brian J. Fox (bfox@@ai.mit.edu) +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1992, 1993, 1997 Free Software Foundation + +Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +sections entitled ``Copying'' and ``GNU General Public License'' are +included exactly as in the original, and provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation +approved by the Free Software Foundation. +@end titlepage + +@ifinfo +@node Top, What is Info, , (dir) +@top The GNU Info Program + +This file documents GNU Info, a program for viewing the on-line +formatted versions of Texinfo files, version @value{InfoProgVer}. This +documentation is different from the documentation for the Info reader +that is part of GNU Emacs. +@end ifinfo + +@menu +* What is Info:: +* Options:: Options you can pass on the command line. +* Cursor Commands:: Commands which move the cursor within a node. +* Scrolling Commands:: Commands for moving the node around + in a window. +* Node Commands:: Commands for selecting a new node. +* Searching Commands:: Commands for searching an Info file. +* Xref Commands:: Commands for selecting cross references. +* Window Commands:: Commands which manipulate multiple windows. +* Printing Nodes:: How to print out the contents of a node. +* Miscellaneous Commands:: A few commands that defy categories. +* Variables:: How to change the default behavior of Info. +* GNU Info Global Index:: Global index containing keystrokes, + command names, variable names, + and general concepts. +@end menu + +@node What is Info, Options, Top, Top +@chapter What is Info? + +@iftex +This file documents GNU Info, a program for viewing the on-line formatted +versions of Texinfo files, version @value{InfoProgVer}. +@end iftex + +@dfn{Info} is a program which is used to view Info files on an ASCII +terminal. @dfn{Info files} are the result of processing Texinfo files +with the program @code{makeinfo} or with one of the Emacs commands, such +as @code{M-x texinfo-format-buffer}. Texinfo itself is a documentation +system that uses a single source file to produce both on-line +information and printed output. You can typeset and print the +files that you read in Info.@refill + +@node Options, Cursor Commands, What is Info, Top +@chapter Command Line Options +@cindex command line options +@cindex arguments, command line + +GNU Info accepts several options to control the initial node being +viewed, and to specify which directories to search for Info files. Here +is a template showing an invocation of GNU Info from the shell: + +@example +info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{} +@end example + +The following @var{option-names} are available when invoking Info from +the shell: + +@table @code +@cindex directory path +@item --directory @var{directory-path} +@itemx -d @var{directory-path} +Add @var{directory-path} to the list of directory paths searched when +Info needs to find a file. You may issue @code{--directory} multiple +times; once for each directory which contains Info files. +Alternatively, you may specify a value for the environment variable +@code{INFOPATH}; if @code{--directory} is not given, the value of +@code{INFOPATH} is used. The value of @code{INFOPATH} is a colon +separated list of directory names. If you do not supply @code{INFOPATH} +or @code{--directory-path}, Info uses a default path. + +@item --file @var{filename} +@itemx -f @var{filename} +@cindex Info file, selecting +Specify a particular Info file to visit. By default, Info visits +the file @code{dir}; if you use this option, Info will start with +@code{(@var{filename})Top} as the first file and node. + +@item --index-search @var{string} +@cindex index search, selecting +@cindex online help, using Info as +Go to the index entry @var{string} in the Info file specified with +@samp{--file}. If no such entry, print @samp{no entries found} and exit +with nonzero status. This can used from another program as a way to +provide online help. + +@item --node @var{nodename} +@itemx -n @var{nodename} +@cindex node, selecting +Specify a particular node to visit in the initial file that Info +loads. This is especially useful in conjunction with +@code{--file}@footnote{Of course, you can specify both the file and node +in a @code{--node} command; but don't forget to escape the open and +close parentheses from the shell as in: @code{info --node +"(emacs)Buffers"}}. You may specify @code{--node} multiple times; for +an interactive Info, each @var{nodename} is visited in its own window, +for a non-interactive Info (such as when @code{--output} is given) each +@var{nodename} is processed sequentially. + +@item --output @var{filename} +@itemx -o @var{filename} +@cindex file, outputting to +@cindex outputting to a file +Specify @var{filename} as the name of a file to which to direct output. +Each node that Info visits will be output to @var{filename} instead of +interactively viewed. A value of @code{-} for @var{filename} specifies +the standard output. + +@item --subnodes +@cindex @code{--subnodes}, command line option +This option only has meaning when given in conjunction with +@code{--output}. It means to recursively output the nodes appearing in +the menus of each node being output. Menu items which resolve to +external Info files are not output, and neither are menu items which are +members of an index. Each node is only output once. + +@item --help +@itemx -h +Produces a relatively brief description of the available Info options. + +@item --version +@cindex version information +Prints the version information of Info and exits. + +@item @var{menu-item} +@cindex menu, following +Info treats its remaining arguments as the names of menu items. The +first argument is a menu item in the initial node visited, while +the second argument is a menu item in the first argument's node. +You can easily move to the node of your choice by specifying the menu +names which describe the path to that node. For example, + +@example +info emacs buffers +@end example + +@noindent +first selects the menu item @samp{Emacs} in the node @samp{(dir)Top}, +and then selects the menu item @samp{Buffers} in the node +@samp{(emacs)Top}. +@end table + +@node Cursor Commands, Scrolling Commands, Options, Top +@chapter Moving the Cursor +@cindex cursor, moving + +Many people find that reading screens of text page by page is made +easier when one is able to indicate particular pieces of text with some +kind of pointing device. Since this is the case, GNU Info (both the +Emacs and standalone versions) have several commands which allow you to +move the cursor about the screen. The notation used in this manual to +describe keystrokes is identical to the notation used within the Emacs +manual, and the GNU Readline manual. @xref{Characters, , Character +Conventions, emacs, the GNU Emacs Manual}, if you are unfamiliar with the +notation. + +The following table lists the basic cursor movement commands in Info. +Each entry consists of the key sequence you should type to execute the +cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it +invokes @code{execute-extended-command}. @xref{M-x, , Executing an +extended command, emacs, the GNU Emacs Manual}, for more detailed +information.} command name (displayed in parentheses), and a short +description of what the command does. All of the cursor motion commands +can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands, +@code{universal-argument}}), to find out how to supply them. With a +numeric argument, the motion commands are simply executed that +many times; for example, a numeric argument of 4 given to +@code{next-line} causes the cursor to move down 4 lines. With a +negative numeric argument, the motion is reversed; an argument of -4 +given to the @code{next-line} command would cause the cursor to move +@emph{up} 4 lines. + +@table @asis +@item @code{C-n} (@code{next-line}) +@kindex C-n +@findex next-line +Move the cursor down to the next line. + +@item @code{C-p} (@code{prev-line}) +@kindex C-p +@findex prev-line +Move the cursor up to the previous line. + +@item @code{C-a} (@code{beginning-of-line}) +@kindex C-a, in Info windows +@findex beginning-of-line +Move the cursor to the start of the current line. + +@item @code{C-e} (@code{end-of-line}) +@kindex C-e, in Info windows +@findex end-of-line +Move the cursor to the end of the current line. + +@item @code{C-f} (@code{forward-char}) +@kindex C-f, in Info windows +@findex forward-char +Move the cursor forward a character. + +@item @code{C-b} (@code{backward-char}) +@kindex C-b, in Info windows +@findex backward-char +Move the cursor backward a character. + +@item @code{M-f} (@code{forward-word}) +@kindex M-f, in Info windows +@findex forward-word +Move the cursor forward a word. + +@item @code{M-b} (@code{backward-word}) +@kindex M-b, in Info windows +@findex backward-word +Move the cursor backward a word. + +@item @code{M-<} (@code{beginning-of-node}) +@itemx @code{b} +@kindex b, in Info windows +@kindex M-< +@findex beginning-of-node +Move the cursor to the start of the current node. + +@item @code{M->} (@code{end-of-node}) +@kindex M-> +@findex end-of-node +Move the cursor to the end of the current node. + +@item @code{M-r} (@code{move-to-window-line}) +@kindex M-r +@findex move-to-window-line +Move the cursor to a specific line of the window. Without a numeric +argument, @code{M-r} moves the cursor to the start of the line in the +center of the window. With a numeric argument of @var{n}, @code{M-r} +moves the cursor to the start of the @var{n}th line in the window. +@end table + +@node Scrolling Commands, Node Commands, Cursor Commands, Top +@chapter Moving Text Within a Window +@cindex scrolling + +Sometimes you are looking at a screenful of text, and only part of the +current paragraph you are reading is visible on the screen. The +commands detailed in this section are used to shift which part of the +current node is visible on the screen. + +@table @asis +@item @code{SPC} (@code{scroll-forward}) +@itemx @code{C-v} +@kindex SPC, in Info windows +@kindex C-v +@findex scroll-forward +Shift the text in this window up. That is, show more of the node which +is currently below the bottom of the window. With a numeric argument, +show that many more lines at the bottom of the window; a numeric +argument of 4 would shift all of the text in the window up 4 lines +(discarding the top 4 lines), and show you four new lines at the bottom +of the window. Without a numeric argument, @key{SPC} takes the bottom +two lines of the window and places them at the top of the window, +redisplaying almost a completely new screenful of lines. + +@item @code{DEL} (@code{scroll-backward}) +@itemx @code{M-v} +@kindex DEL, in Info windows +@kindex M-v +@findex scroll-backward +Shift the text in this window down. The inverse of +@code{scroll-forward}. +@end table + +@cindex scrolling through node structure +The @code{scroll-forward} and @code{scroll-backward} commands can also +move forward and backward through the node structure of the file. If +you press @key{SPC} while viewing the end of a node, or @key{DEL} while +viewing the beginning of a node, what happens is controlled by the +variable @code{scroll-behavior}. @xref{Variables, +@code{scroll-behavior}}, for more information. + +@table @asis +@item @code{C-l} (@code{redraw-display}) +@kindex C-l +@findex redraw-display +Redraw the display from scratch, or shift the line containing the cursor +to a specified location. With no numeric argument, @samp{C-l} clears +the screen, and then redraws its entire contents. Given a numeric +argument of @var{n}, the line containing the cursor is shifted so that +it is on the @var{n}th line of the window. + +@item @code{C-x w} (@code{toggle-wrap}) +@kindex C-w +@findex toggle-wrap +Toggles the state of line wrapping in the current window. Normally, +lines which are longer than the screen width @dfn{wrap}, i.e., they are +continued on the next line. Lines which wrap have a @samp{\} appearing +in the rightmost column of the screen. You can cause such lines to be +terminated at the rightmost column by changing the state of line +wrapping in the window with @code{C-x w}. When a line which needs more +space than one screen width to display is displayed, a @samp{$} appears +in the rightmost column of the screen, and the remainder of the line is +invisible. +@end table + +@node Node Commands, Searching Commands, Scrolling Commands, Top +@chapter Selecting a New Node +@cindex nodes, selection of + +This section details the numerous Info commands which select a new node +to view in the current window. + +The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and +@samp{l}. + +When you are viewing a node, the top line of the node contains some Info +@dfn{pointers} which describe where the next, previous, and up nodes +are. Info uses this line to move about the node structure of the file +when you use the following commands: + +@table @asis +@item @code{n} (@code{next-node}) +@kindex n +@findex next-node +Select the `Next' node. + +@item @code{p} (@code{prev-node}) +@kindex p +@findex prev-node +Select the `Prev' node. + +@item @code{u} (@code{up-node}) +@kindex u +@findex up-node +Select the `Up' node. +@end table + +You can easily select a node that you have already viewed in this window +by using the @samp{l} command -- this name stands for "last", and +actually moves through the list of already visited nodes for this +window. @samp{l} with a negative numeric argument moves forward through +the history of nodes for this window, so you can quickly step between +two adjacent (in viewing history) nodes. + +@table @asis +@item @code{l} (@code{history-node}) +@kindex l +@findex history-node +Select the most recently selected node in this window. +@end table + +Two additional commands make it easy to select the most commonly +selected nodes; they are @samp{t} and @samp{d}. + +@table @asis +@item @code{t} (@code{top-node}) +@kindex t +@findex top-node +Select the node @samp{Top} in the current Info file. + +@item @code{d} (@code{dir-node}) +@kindex d +@findex dir-node +Select the directory node (i.e., the node @samp{(dir)}). +@end table + +Here are some other commands which immediately result in the selection +of a different node in the current window: + +@table @asis +@item @code{<} (@code{first-node}) +@kindex < +@findex first-node +Selects the first node which appears in this file. This node is most +often @samp{Top}, but it does not have to be. + +@item @code{>} (@code{last-node}) +@kindex > +@findex last-node +Select the last node which appears in this file. + +@item @code{]} (@code{global-next-node}) +@kindex ] +@findex global-next-node +Move forward or down through node structure. If the node that you are +currently viewing has a @samp{Next} pointer, that node is selected. +Otherwise, if this node has a menu, the first menu item is selected. If +there is no @samp{Next} and no menu, the same process is tried with the +@samp{Up} node of this node. + +@item @code{[} (@code{global-prev-node}) +@kindex [ +@findex global-prev-node +Move backward or up through node structure. If the node that you are +currently viewing has a @samp{Prev} pointer, that node is selected. +Otherwise, if the node has an @samp{Up} pointer, that node is selected, +and if it has a menu, the last item in the menu is selected. +@end table + +You can get the same behavior as @code{global-next-node} and +@code{global-prev-node} while simply scrolling through the file with +@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for +more information. + +@table @asis +@item @code{g} (@code{goto-node}) +@kindex g +@findex goto-node +Read the name of a node and select it. No completion is done while +reading the node name, since the desired node may reside in a separate +file. The node must be typed exactly as it appears in the Info file. A +file name may be included as with any node specification, for example + +@example +@code{g(emacs)Buffers} +@end example + +finds the node @samp{Buffers} in the Info file @file{emacs}. + +@item @code{C-x k} (@code{kill-node}) +@kindex C-x k +@findex kill-node +Kill a node. The node name is prompted for in the echo area, with a +default of the current node. @dfn{Killing} a node means that Info tries +hard to forget about it, removing it from the list of history nodes kept +for the window where that node is found. Another node is selected in +the window which contained the killed node. + +@item @code{C-x C-f} (@code{view-file}) +@kindex C-x C-f +@findex view-file +Read the name of a file and selects the entire file. The command +@example +@code{C-x C-f @var{filename}} +@end example +is equivalent to typing +@example +@code{g(@var{filename})*} +@end example + +@item @code{C-x C-b} (@code{list-visited-nodes}) +@kindex C-x C-b +@findex list-visited-nodes +Make a window containing a menu of all of the currently visited nodes. +This window becomes the selected window, and you may use the standard +Info commands within it. + +@item @code{C-x b} (@code{select-visited-node}) +@kindex C-x b +@findex select-visited-node +Select a node which has been previously visited in a visible window. +This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is +created. +@end table + +@node Searching Commands, Xref Commands, Node Commands, Top +@chapter Searching an Info File +@cindex searching + +GNU Info allows you to search for a sequence of characters throughout an +entire Info file, search through the indices of an Info file, or find +areas within an Info file which discuss a particular topic. + +@table @asis +@item @code{s} (@code{search}) +@kindex s +@findex search +Read a string in the echo area and search for it. + +@item @code{C-s} (@code{isearch-forward}) +@kindex C-s +@findex isearch-forward +Interactively search forward through the Info file for a string as you +type it. + +@item @code{C-r} (@code{isearch-backward}) +@kindex C-r +@findex isearch-backward +Interactively search backward through the Info file for a string as +you type it. + +@item @code{i} (@code{index-search}) +@kindex i +@findex index-search +Look up a string in the indices for this Info file, and select a node +where the found index entry points to. + +@item @code{,} (@code{next-index-match}) +@kindex , +@findex next-index-match +Move to the node containing the next matching index item from the last +@samp{i} command. +@end table + +The most basic searching command is @samp{s} (@code{search}). The +@samp{s} command prompts you for a string in the echo area, and then +searches the remainder of the Info file for an occurrence of that string. +If the string is found, the node containing it is selected, and the +cursor is left positioned at the start of the found string. Subsequent +@samp{s} commands show you the default search string within @samp{[} and +@samp{]}; pressing @key{RET} instead of typing a new string will use the +default search string. + +@dfn{Incremental searching} is similar to basic searching, but the +string is looked up while you are typing it, instead of waiting until +the entire search string has been specified. + +@node Xref Commands, Window Commands, Searching Commands, Top +@chapter Selecting Cross References + +We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up} +pointers which appear at the top of a node. In addition to these +pointers, a node may contain other pointers which refer you to a +different node, perhaps in another Info file. Such pointers are called +@dfn{cross references}, or @dfn{xrefs} for short. + +@menu +* Parts of an Xref:: What a cross reference is made of. +* Selecting Xrefs:: Commands for selecting menu or note items. +@end menu + +@node Parts of an Xref, Selecting Xrefs, , Xref Commands +@section Parts of an Xref + +Cross references have two major parts: the first part is called the +@dfn{label}; it is the name that you can use to refer to the cross +reference, and the second is the @dfn{target}; it is the full name of +the node that the cross reference points to. + +The target is separated from the label by a colon @samp{:}; first the +label appears, and then the target. For example, in the sample menu +cross reference below, the single colon separates the label from the +target. + +@example +* Foo Label: Foo Target. More information about Foo. +@end example + +Note the @samp{.} which ends the name of the target. The @samp{.} is +not part of the target; it serves only to let Info know where the target +name ends. + +A shorthand way of specifying references allows two adjacent colons to +stand for a target name which is the same as the label name: + +@example +* Foo Commands:: Commands pertaining to Foo. +@end example + +In the above example, the name of the target is the same as the name of +the label, in this case @code{Foo Commands}. + +You will normally see two types of cross reference while viewing nodes: +@dfn{menu} references, and @dfn{note} references. Menu references +appear within a node's menu; they begin with a @samp{*} at the beginning +of a line, and continue with a label, a target, and a comment which +describes what the contents of the node pointed to contains. + +Note references appear within the body of the node text; they begin with +@code{*Note}, and continue with a label and a target. + +Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references +can point to any valid node. They are used to refer you to a place +where more detailed information can be found on a particular subject. +Here is a cross reference which points to a node within the Texinfo +documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo +Manual}, for more information on creating your own texinfo cross +references. + +@node Selecting Xrefs, , Parts of an Xref, Xref Commands +@section Selecting Xrefs + +The following table lists the Info commands which operate on menu items. + +@table @asis +@item @code{1} (@code{menu-digit}) +@itemx @code{2} @dots{} @code{9} +@cindex 1 @dots{} 9, in Info windows +@kindex 1 @dots{} 9, in Info windows +@findex menu-digit +Within an Info window, pressing a single digit, (such as @samp{1}), +selects that menu item, and places its node in the current window. +For convenience, there is one exception; pressing @samp{0} selects the +@emph{last} item in the node's menu. + +@item @code{0} (@code{last-menu-item}) +@kindex 0, in Info windows +@findex last-menu-item +Select the last item in the current node's menu. + +@item @code{m} (@code{menu-item}) +@kindex m +@findex menu-item +Reads the name of a menu item in the echo area and selects its node. +Completion is available while reading the menu label. + +@item @code{M-x find-menu} +@findex find-menu +Move the cursor to the start of this node's menu. +@end table + +This table lists the Info commands which operate on note cross references. + +@table @asis +@item @code{f} (@code{xref-item}) +@itemx @code{r} +@kindex f +@kindex r +@findex xref-item +Reads the name of a note cross reference in the echo area and selects +its node. Completion is available while reading the cross reference +label. +@end table + +Finally, the next few commands operate on menu or note references alike: + +@table @asis +@item @code{TAB} (@code{move-to-next-xref}) +@kindex TAB, in Info windows +@findex move-to-next-xref +Move the cursor to the start of the next nearest menu item or note +reference in this node. You can then use @key{RET} +(@code{select-reference-this-line}) to select the menu or note reference. + +@item @code{M-TAB} (@code{move-to-prev-xref}) +@kindex M-TAB, in Info windows +@findex move-to-prev-xref +Move the cursor the start of the nearest previous menu item or note +reference in this node. + +@item @code{RET} (@code{select-reference-this-line}) +@kindex RET, in Info windows +@findex select-reference-this-line +Select the menu item or note reference appearing on this line. +@end table + +@node Window Commands, Printing Nodes, Xref Commands, Top +@chapter Manipulating Multiple Windows +@cindex windows, manipulating + +A @dfn{window} is a place to show the text of a node. Windows have a +view area where the text of the node is displayed, and an associated +@dfn{mode line}, which briefly describes the node being viewed. + +GNU Info supports multiple windows appearing in a single screen; each +window is separated from the next by its modeline. At any time, there +is only one @dfn{active} window, that is, the window in which the cursor +appears. There are commands available for creating windows, changing +the size of windows, selecting which window is active, and for deleting +windows. + +@menu +* The Mode Line:: What appears in the mode line? +* Basic Windows:: Manipulating windows in Info. +* The Echo Area:: Used for displaying errors and reading input. +@end menu + +@node The Mode Line, Basic Windows, , Window Commands +@section The Mode Line + +A @dfn{mode line} is a line of inverse video which appears at the bottom +of an Info window. It describes the contents of the window just above +it; this information includes the name of the file and node appearing in +that window, the number of screen lines it takes to display the node, +and the percentage of text that is above the top of the window. It can +also tell you if the indirect tags table for this Info file needs to be +updated, and whether or not the Info file was compressed when stored on +disk. + +Here is a sample mode line for a window containing an uncompressed file +named @file{dir}, showing the node @samp{Top}. + +@example +@group +-----Info: (dir)Top, 40 lines --Top--------------------------------------- + ^^ ^ ^^^ ^^ + (file)Node #lines where +@end group +@end example + +When a node comes from a file which is compressed on disk, this is +indicated in the mode line with two small @samp{z}'s. In addition, if +the Info file containing the node has been split into subfiles, the name +of the subfile containing the node appears in the modeline as well: + +@example +--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- +@end example + +When Info makes a node internally, such that there is no corresponding +info file on disk, the name of the node is surrounded by asterisks +(@samp{*}). The name itself tells you what the contents of the window +are; the sample mode line below shows an internally constructed node +showing possible completions: + +@example +-----Info: *Completions*, 7 lines --All----------------------------------- +@end example + +@node Basic Windows, The Echo Area, The Mode Line, Window Commands +@section Window Commands + +It can be convenient to view more than one node at a time. To allow +this, Info can display more than one @dfn{window}. Each window has its +own mode line (@pxref{The Mode Line}) and history of nodes viewed in that +window (@pxref{Node Commands, , @code{history-node}}). + +@table @asis +@item @code{C-x o} (@code{next-window}) +@cindex windows, selecting +@kindex C-x o +@findex next-window +Select the next window on the screen. Note that the echo area can only be +selected if it is already in use, and you have left it temporarily. +Normally, @samp{C-x o} simply moves the cursor into the next window on +the screen, or if you are already within the last window, into the first +window on the screen. Given a numeric argument, @samp{C-x o} moves over +that many windows. A negative argument causes @samp{C-x o} to select +the previous window on the screen. + +@item @code{M-x prev-window} +@findex prev-window +Select the previous window on the screen. This is identical to +@samp{C-x o} with a negative argument. + +@item @code{C-x 2} (@code{split-window}) +@cindex windows, creating +@kindex C-x 2 +@findex split-window +Split the current window into two windows, both showing the same node. +Each window is one half the size of the original window, and the cursor +remains in the original window. The variable @code{automatic-tiling} +can cause all of the windows on the screen to be resized for you +automatically, please @pxref{Variables, , automatic-tiling} for more +information. + +@item @code{C-x 0} (@code{delete-window}) +@cindex windows, deleting +@kindex C-x 0 +@findex delete-window +Delete the current window from the screen. If you have made too many +windows and your screen appears cluttered, this is the way to get rid of +some of them. + +@item @code{C-x 1} (@code{keep-one-window}) +@kindex C-x 1 +@findex keep-one-window +Delete all of the windows excepting the current one. + +@item @code{ESC C-v} (@code{scroll-other-window}) +@kindex ESC C-v, in Info windows +@findex scroll-other-window +Scroll the other window, in the same fashion that @samp{C-v} might +scroll the current window. Given a negative argument, scroll the +"other" window backward. + +@item @code{C-x ^} (@code{grow-window}) +@kindex C-x ^ +@findex grow-window +Grow (or shrink) the current window. Given a numeric argument, grow +the current window that many lines; with a negative numeric argument, +shrink the window instead. + +@item @code{C-x t} (@code{tile-windows}) +@cindex tiling +@kindex C-x t +@findex tile-windows +Divide the available screen space among all of the visible windows. +Each window is given an equal portion of the screen in which to display +its contents. The variable @code{automatic-tiling} can cause +@code{tile-windows} to be called when a window is created or deleted. +@xref{Variables, , @code{automatic-tiling}}. +@end table + +@node The Echo Area, , Basic Windows, Window Commands +@section The Echo Area +@cindex echo area + +The @dfn{echo area} is a one line window which appears at the bottom of +the screen. It is used to display informative or error messages, and to +read lines of input from you when that is necessary. Almost all of the +commands available in the echo area are identical to their Emacs +counterparts, so please refer to that documentation for greater depth of +discussion on the concepts of editing a line of text. The following +table briefly lists the commands that are available while input is being +read in the echo area: + +@table @asis +@item @code{C-f} (@code{echo-area-forward}) +@kindex C-f, in the echo area +@findex echo-area-forward +Move forward a character. + +@item @code{C-b} (@code{echo-area-backward}) +@kindex C-b, in the echo area +@findex echo-area-backward +Move backward a character. + +@item @code{C-a} (@code{echo-area-beg-of-line}) +@kindex C-a, in the echo area +@findex echo-area-beg-of-line +Move to the start of the input line. + +@item @code{C-e} (@code{echo-area-end-of-line}) +@kindex C-e, in the echo area +@findex echo-area-end-of-line +Move to the end of the input line. + +@item @code{M-f} (@code{echo-area-forward-word}) +@kindex M-f, in the echo area +@findex echo-area-forward-word +Move forward a word. + +@item @code{M-b} (@code{echo-area-backward-word}) +@kindex M-b, in the echo area +@findex echo-area-backward-word +Move backward a word. + +@item @code{C-d} (@code{echo-area-delete}) +@kindex C-d, in the echo area +@findex echo-area-delete +Delete the character under the cursor. + +@item @code{DEL} (@code{echo-area-rubout}) +@kindex DEL, in the echo area +@findex echo-area-rubout +Delete the character behind the cursor. + +@item @code{C-g} (@code{echo-area-abort}) +@kindex C-g, in the echo area +@findex echo-area-abort +Cancel or quit the current operation. If completion is being read, +@samp{C-g} discards the text of the input line which does not match any +completion. If the input line is empty, @samp{C-g} aborts the calling +function. + +@item @code{RET} (@code{echo-area-newline}) +@kindex RET, in the echo area +@findex echo-area-newline +Accept (or forces completion of) the current input line. + +@item @code{C-q} (@code{echo-area-quoted-insert}) +@kindex C-q, in the echo area +@findex echo-area-quoted-insert +Insert the next character verbatim. This is how you can insert control +characters into a search string, for example. + +@item @var{printing character} (@code{echo-area-insert}) +@kindex printing characters, in the echo area +@findex echo-area-insert +Insert the character. + +@item @code{M-TAB} (@code{echo-area-tab-insert}) +@kindex M-TAB, in the echo area +@findex echo-area-tab-insert +Insert a TAB character. + +@item @code{C-t} (@code{echo-area-transpose-chars}) +@kindex C-t, in the echo area +@findex echo-area-transpose-chars +Transpose the characters at the cursor. +@end table + +The next group of commands deal with @dfn{killing}, and @dfn{yanking} +text. For an in depth discussion of killing and yanking, +@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual} + +@table @asis +@item @code{M-d} (@code{echo-area-kill-word}) +@kindex M-d, in the echo area +@findex echo-area-kill-word +Kill the word following the cursor. + +@item @code{M-DEL} (@code{echo-area-backward-kill-word}) +@kindex M-DEL, in the echo area +@findex echo-area-backward-kill-word +Kill the word preceding the cursor. + +@item @code{C-k} (@code{echo-area-kill-line}) +@kindex C-k, in the echo area +@findex echo-area-kill-line +Kill the text from the cursor to the end of the line. + +@item @code{C-x DEL} (@code{echo-area-backward-kill-line}) +@kindex C-x DEL, in the echo area +@findex echo-area-backward-kill-line +Kill the text from the cursor to the beginning of the line. + +@item @code{C-y} (@code{echo-area-yank}) +@kindex C-y, in the echo area +@findex echo-area-yank +Yank back the contents of the last kill. + +@item @code{M-y} (@code{echo-area-yank-pop}) +@kindex M-y, in the echo area +@findex echo-area-yank-pop +Yank back a previous kill, removing the last yanked text first. +@end table + +Sometimes when reading input in the echo area, the command that needed +input will only accept one of a list of several choices. The choices +represent the @dfn{possible completions}, and you must respond with one +of them. Since there are a limited number of responses you can make, +Info allows you to abbreviate what you type, only typing as much of the +response as is necessary to uniquely identify it. In addition, you can +request Info to fill in as much of the response as is possible; this +is called @dfn{completion}. + +The following commands are available when completing in the echo area: + +@table @asis +@item @code{TAB} (@code{echo-area-complete}) +@itemx @code{SPC} +@kindex TAB, in the echo area +@kindex SPC, in the echo area +@findex echo-area-complete +Insert as much of a completion as is possible. + +@item @code{?} (@code{echo-area-possible-completions}) +@kindex ?, in the echo area +@findex echo-area-possible-completions +Display a window containing a list of the possible completions of what +you have typed so far. For example, if the available choices are: + +@example +@group +bar +foliate +food +forget +@end group +@end example + +@noindent +and you have typed an @samp{f}, followed by @samp{?}, the possible +completions would contain: + +@example +@group +foliate +food +forget +@end group +@end example + +@noindent +i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC} +or @key{TAB} would result in @samp{fo} appearing in the echo area, since +all of the choices which begin with @samp{f} continue with @samp{o}. +Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate} +appearing in the echo area, since that is the only choice which begins +with @samp{fol}. + +@item @code{ESC C-v} (@code{echo-area-scroll-completions-window}) +@kindex ESC C-v, in the echo area +@findex echo-area-scroll-completions-window +Scroll the completions window, if that is visible, or the "other" +window if not. +@end table + +@node Printing Nodes, Miscellaneous Commands, Window Commands, Top +@chapter Printing Out Nodes +@cindex printing + +You may wish to print out the contents of a node as a quick reference +document for later use. Info provides you with a command for doing +this. In general, we recommend that you use @TeX{} to format the +document and print sections of it, by running @code{tex} on the Texinfo +source file. + +@table @asis +@item @code{M-x print-node} +@findex print-node +@cindex INFO_PRINT_COMMAND, environment variable +Pipe the contents of the current node through the command in the +environment variable @code{INFO_PRINT_COMMAND}. If the variable does not +exist, the node is simply piped to @code{lpr}. +@end table + +@node Miscellaneous Commands, Variables, Printing Nodes, Top +@chapter Miscellaneous Commands + +GNU Info contains several commands which self-document GNU Info: + +@table @asis +@item @code{M-x describe-command} +@cindex functions, describing +@cindex commands, describing +@findex describe-command +Read the name of an Info command in the echo area and then display a +brief description of what that command does. + +@item @code{M-x describe-key} +@cindex keys, describing +@findex describe-key +Read a key sequence in the echo area, and then display the name and +documentation of the Info command that the key sequence invokes. + +@item @code{M-x describe-variable} +Read the name of a variable in the echo area and then display a brief +description of what the variable affects. + +@item @code{M-x where-is} +@findex where-is +Read the name of an Info command in the echo area, and then display +a key sequence which can be typed in order to invoke that command. + +@item @code{C-h} (@code{get-help-window}) +@itemx @code{?} +@kindex C-h +@kindex ?, in Info windows +@findex get-help-window +Create (or Move into) the window displaying @code{*Help*}, and place +a node containing a quick reference card into it. This window displays +the most concise information about GNU Info available. + +@item @code{h} (@code{get-info-help-node}) +@kindex h +@findex get-info-help-node +Try hard to visit the node @code{(info)Help}. The Info file +@file{info.texi} distributed with GNU Info contains this node. Of +course, the file must first be processed with @code{makeinfo}, and then +placed into the location of your Info directory. +@end table + +Here are the commands for creating a numeric argument: + +@table @asis +@item @code{C-u} (@code{universal-argument}) +@cindex numeric arguments +@kindex C-u +@findex universal-argument +Start (or multiply by 4) the current numeric argument. @samp{C-u} is +a good way to give a small numeric argument to cursor movement or +scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while +@samp{C-u C-u C-n} moves the cursor down 16 lines. + +@item @code{M-1} (@code{add-digit-to-numeric-arg}) +@itemx @code{M-2} @dots{} @code{M-9} +@kindex M-1 @dots{} M-9 +@findex add-digit-to-numeric-arg +Add the digit value of the invoking key to the current numeric +argument. Once Info is reading a numeric argument, you may just type +the digits of the argument, without the Meta prefix. For example, you +might give @samp{C-l} a numeric argument of 32 by typing: + +@example +@kbd{C-u 3 2 C-l} +@end example + +@noindent +or + +@example +@kbd{M-3 2 C-l} +@end example +@end table + +@samp{C-g} is used to abort the reading of a multi-character key +sequence, to cancel lengthy operations (such as multi-file searches) and +to cancel reading input in the echo area. + +@table @asis +@item @code{C-g} (@code{abort-key}) +@cindex cancelling typeahead +@cindex cancelling the current operation +@kindex C-g, in Info windows +@findex abort-key +Cancel current operation. +@end table + +The @samp{q} command of Info simply quits running Info. + +@table @asis +@item @code{q} (@code{quit}) +@cindex quitting +@kindex q +@findex quit +Exit GNU Info. +@end table + +If the operating system tells GNU Info that the screen is 60 lines tall, +and it is actually only 40 lines tall, here is a way to tell Info that +the operating system is correct. + +@table @asis +@item @code{M-x set-screen-height} +@findex set-screen-height +@cindex screen, changing the height of +Read a height value in the echo area and set the height of the +displayed screen to that value. +@end table + +Finally, Info provides a convenient way to display footnotes which might +be associated with the current node that you are viewing: + +@table @asis +@item @code{ESC C-f} (@code{show-footnotes}) +@kindex ESC C-f +@findex show-footnotes +@cindex footnotes, displaying +Show the footnotes (if any) associated with the current node in another +window. You can have Info automatically display the footnotes +associated with a node when the node is selected by setting the variable +@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}. +@end table + +@node Variables, GNU Info Global Index, Miscellaneous Commands, Top +@chapter Manipulating Variables + +GNU Info contains several @dfn{variables} whose values are looked at by +various Info commands. You can change the values of these variables, +and thus change the behavior of Info to more closely match your +environment and Info file reading manner. + +@table @asis +@item @code{M-x set-variable} +@cindex variables, setting +@findex set-variable +Read the name of a variable, and the value for it, in the echo area and +then set the variable to that value. Completion is available when +reading the variable name; often, completion is available when reading +the value to give to the variable, but that depends on the variable +itself. If a variable does @emph{not} supply multiple choices to +complete over, it expects a numeric value. + +@item @code{M-x describe-variable} +@cindex variables, describing +@findex describe-variable +Read the name of a variable in the echo area and then display a brief +description of what the variable affects. +@end table + +Here is a list of the variables that you can set in Info. + +@table @code +@item automatic-footnotes +@vindex automatic-footnotes +When set to @code{On}, footnotes appear and disappear automatically. +This variable is @code{On} by default. When a node is selected, a +window containing the footnotes which appear in that node is created, +and the footnotes are displayed within the new window. The window that +Info creates to contain the footnotes is called @samp{*Footnotes*}. If +a node is selected which contains no footnotes, and a @samp{*Footnotes*} +window is on the screen, the @samp{*Footnotes*} window is deleted. +Footnote windows created in this fashion are not automatically tiled so +that they can use as little of the display as is possible. + +@item automatic-tiling +@vindex automatic-tiling +When set to @code{On}, creating or deleting a window resizes other +windows. This variable is @code{Off} by default. Normally, typing +@samp{C-x 2} divides the current window into two equal parts. When +@code{automatic-tiling} is set to @code{On}, all of the windows are +resized automatically, keeping an equal number of lines visible in each +window. There are exceptions to the automatic tiling; specifically, the +windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not} +resized through automatic tiling; they remain their original size. + +@item visible-bell +@vindex visible-bell +When set to @code{On}, GNU Info attempts to flash the screen instead of +ringing the bell. This variable is @code{Off} by default. Of course, +Info can only flash the screen if the terminal allows it; in the case +that the terminal does not allow it, the setting of this variable has no +effect. However, you can make Info perform quietly by setting the +@code{errors-ring-bell} variable to @code{Off}. + +@item errors-ring-bell +@vindex errors-ring-bell +When set to @code{On}, errors cause the bell to ring. The default +setting of this variable is @code{On}. + +@item gc-compressed-files +@vindex gc-compressed-files +When set to @code{On}, Info garbage collects files which had to be +uncompressed. The default value of this variable is @code{Off}. +Whenever a node is visited in Info, the Info file containing that node +is read into core, and Info reads information about the tags and nodes +contained in that file. Once the tags information is read by Info, it +is never forgotten. However, the actual text of the nodes does not need +to remain in core unless a particular Info window needs it. For +non-compressed files, the text of the nodes does not remain in core when +it is no longer in use. But de-compressing a file can be a time +consuming operation, and so Info tries hard not to do it twice. +@code{gc-compressed-files} tells Info it is okay to garbage collect the +text of the nodes of a file which was compressed on disk. + +@item show-index-match +@vindex show-index-match +When set to @code{On}, the portion of the matched search string is +highlighted in the message which explains where the matched search +string was found. The default value of this variable is @code{On}. +When Info displays the location where an index match was found, +(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the +string that you had typed is highlighted by displaying it in the inverse +case from its surrounding characters. + +@item scroll-behavior +@vindex scroll-behavior +Control what happens when forward scrolling is requested at the end of +a node, or when backward scrolling is requested at the beginning of a +node. The default value for this variable is @code{Continuous}. There +are three possible values for this variable: + +@table @code +@item Continuous +Try to get the first item in this node's menu, or failing that, the +@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}. +This behavior is identical to using the @samp{]} +(@code{global-next-node}) and @samp{[} (@code{global-prev-node}) +commands. + +@item Next Only +Only try to get the @samp{Next} node. + +@item Page Only +Simply give up, changing nothing. If @code{scroll-behavior} is +@code{Page Only}, no scrolling command can change the node that is being +viewed. +@end table + +@item scroll-step +@vindex scroll-step +The number of lines to scroll when the cursor moves out of the window. +Scrolling happens automatically if the cursor has moved out of the +visible portion of the node text when it is time to display. Usually +the scrolling is done so as to put the cursor on the center line of the +current window. However, if the variable @code{scroll-step} has a +nonzero value, Info attempts to scroll the node text by that many lines; +if that is enough to bring the cursor back into the window, that is what +is done. The default value of this variable is 0, thus placing the +cursor (and the text it is attached to) in the center of the window. +Setting this variable to 1 causes a kind of "smooth scrolling" which +some people prefer. + +@item ISO-Latin +@cindex ISO Latin characters +@vindex ISO-Latin +When set to @code{On}, Info accepts and displays ISO Latin characters. +By default, Info assumes an ASCII character set. @code{ISO-Latin} tells +Info that it is running in an environment where the European standard +character set is in use, and allows you to input such characters to +Info, as well as display them. +@end table + + + +@c the following is incomplete +@ignore +@c node Info for Sys Admins +@c chapter Info for System Administrators + +This text describes some common ways of setting up an Info hierarchy +from scratch, and details the various options that are available when +installing Info. This text is designed for the person who is installing +GNU Info on the system; although users may find the information present +in this section interesting, none of it is vital to understanding how to +use GNU Info. + +@menu +* Setting the INFOPATH:: Where are my Info files kept? +* Editing the DIR node:: What goes in `DIR', and why? +* Storing Info files:: Alternate formats allow flexibility in setups. +* Using `localdir':: Building DIR on the fly. +* Example setups:: Some common ways to organize Info files. +@end menu + +@c node Setting the INFOPATH +@c section Setting the INFOPATH + +Where are my Info files kept? + +@c node Editing the DIR node +@c section Editing the DIR node + +What goes in `DIR', and why? + +@c node Storing Info files +@c section Storing Info files + +Alternate formats allow flexibility in setups. + +@c node Using `localdir' +@c section Using `localdir' + +Building DIR on the fly. + +@c node Example setups +@c section Example setups + +Some common ways to organize Info files. +@end ignore + +@node GNU Info Global Index, , Variables, Top +@appendix Global Index + +@printindex cp + +@contents +@bye diff --git a/gnu/usr.bin/texinfo/doc/info.texi b/gnu/usr.bin/texinfo/doc/info.texi new file mode 100644 index 00000000000..8282ff8cd31 --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/info.texi @@ -0,0 +1,911 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header +@setfilename info.info +@settitle Info 1.0 +@comment %**end of header +@comment $Id: info.texi,v 1.1 1997/08/01 22:01:10 kstailey Exp $ + +@dircategory Texinfo documentation system +@direntry +* Info: (info). Documentation browsing system. +@end direntry + +@ifinfo +This file describes how to use Info, +the on-line, menu-driven GNU documentation system. + +Copyright (C) 1989, 92, 96, 97 Free Software Foundation, Inc. + +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. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +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. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Free Software Foundation. +@end ifinfo + +@titlepage +@title Info +@subtitle The online, menu-driven GNU documentation system +@author Brian Fox +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1989, 1992, 1993, 1996, 1997 Free Software +Foundation, Inc. +@sp 2 + +Published by the Free Software Foundation @* +59 Temple Place - Suite 330 @* +Boston, MA 02111-1307, USA. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Free Software Foundation. +@end titlepage + +@ifinfo +@node Top, Getting Started, , (dir) +@top Info: An Introduction + +Info is a program for reading documentation, which you are using now. + +To learn how to use Info, type the command @kbd{h}. It brings you +to a programmed instruction sequence. + +@c Need to make sure that `Info-help' goes to the right node, +@c which is the first node of the first chapter. (It should.) +@c (Info-find-node "info" +@c (if (< (window-height) 23) +@c "Help-Small-Screen" +@c "Help"))) + +To learn advanced Info commands, type @kbd{n} twice. This brings you to +@cite{Info for Experts}, skipping over the `Getting Started' chapter. +@end ifinfo + +@menu +* Getting Started:: Getting started using an Info reader. +* Advanced Info:: Advanced commands within Info. +* Create an Info File:: How to make your own Info file. +* The Standalone Info Program: (info-stnd.info). +@end menu + +@node Getting Started, Advanced Info, Top, Top +@comment node-name, next, previous, up +@chapter Getting Started + +This first part of the Info manual describes how to get around inside +of Info. The second part of the manual describes various advanced +Info commands, and how to write an Info as distinct from a Texinfo +file. The third part is about how to generate Info files from +Texinfo files. + +@iftex +This manual is primarily designed for use on a computer, so that you can +try Info commands while reading about them. Reading it on paper is less +effective, since you must take it on faith that the commands described +really do what the manual says. By all means go through this manual now +that you have it; but please try going through the on-line version as +well. + +There are two ways of looking at the online version of this manual: + +@enumerate +@item +Type @code{info} at your shell's command line. This approach uses a +small stand-alone program designed just to read Info files. + +@item +Type @code{emacs} at the command line; then type @kbd{C-h i} (Control +@kbd{h}, followed by @kbd{i}). This approach uses the Info mode of the +Emacs program, an editor with many other capabilities. +@end enumerate + +In either case, then type @kbd{mInfo} (just the letters), followed by +@key{RET}---the ``Return'' or ``Enter'' key. At this point, you should +be ready to follow the instructions in this manual as you read them on +the screen. +@c FIXME! (pesch@cygnus.com, 14 dec 1992) +@c Is it worth worrying about what-if the beginner goes to somebody +@c else's Emacs session, which already has an Info running in the middle +@c of something---in which case these simple instructions won't work? +@end iftex + +@menu +* Help-Small-Screen:: Starting Info on a Small Screen +* Help:: How to use Info +* Help-P:: Returning to the Previous node +* Help-^L:: The Space, Rubout, B and ^L commands. +* Help-M:: Menus +* Help-Adv:: Some advanced Info commands +* Help-Q:: Quitting Info +@end menu + +@node Help-Small-Screen, Help, , Getting Started +@comment node-name, next, previous, up +@section Starting Info on a Small Screen + +@iftex +(In Info, you only see this section if your terminal has a small +number of lines; most readers pass by it without seeing it.) +@end iftex + +Since your terminal has an unusually small number of lines on its +screen, it is necessary to give you special advice at the beginning. + +If you see the text @samp{--All----} at near the bottom right corner +of the screen, it means the entire text you are looking at fits on the +screen. If you see @samp{--Top----} instead, it means that there is +more text below that does not fit. To move forward through the text +and see another screen full, press the Space bar, @key{SPC}. To move +back up, press the key labeled @samp{Backspace} or @key{Delete}. + +@ifinfo +Here are 40 lines of junk, so you can try Spaces and Deletes and +see what they do. At the end are instructions of what you should do +next. + +This is line 17 @* +This is line 18 @* +This is line 19 @* +This is line 20 @* +This is line 21 @* +This is line 22 @* +This is line 23 @* +This is line 24 @* +This is line 25 @* +This is line 26 @* +This is line 27 @* +This is line 28 @* +This is line 29 @* +This is line 30 @* +This is line 31 @* +This is line 32 @* +This is line 33 @* +This is line 34 @* +This is line 35 @* +This is line 36 @* +This is line 37 @* +This is line 38 @* +This is line 39 @* +This is line 40 @* +This is line 41 @* +This is line 42 @* +This is line 43 @* +This is line 44 @* +This is line 45 @* +This is line 46 @* +This is line 47 @* +This is line 48 @* +This is line 49 @* +This is line 50 @* +This is line 51 @* +This is line 52 @* +This is line 53 @* +This is line 54 @* +This is line 55 @* +This is line 56 @* + +If you have managed to get here, go back to the beginning with +Delete, and come back here again, then you understand Space and +Delete. So now type an @kbd{n} ---just one character; don't type +the quotes and don't type the Return key afterward--- to +get to the normal start of the course. +@end ifinfo + +@node Help, Help-P, Help-Small-Screen, Getting Started +@comment node-name, next, previous, up +@section How to use Info + +You are talking to the program Info, for reading documentation. + + Right now you are looking at one @dfn{Node} of Information. +A node contains text describing a specific topic at a specific +level of detail. This node's topic is ``how to use Info''. + + The top line of a node is its @dfn{header}. This node's header (look at +it now) says that it is the node named @samp{Help} in the file +@file{info}. It says that the @samp{Next} node after this one is the node +called @samp{Help-P}. An advanced Info command lets you go to any node +whose name you know. + + Besides a @samp{Next}, a node can have a @samp{Previous} or an @samp{Up}. +This node has a @samp{Previous} but no @samp{Up}, as you can see. + + Now it is time to move on to the @samp{Next} node, named @samp{Help-P}. + +>> Type @samp{n} to move there. Type just one character; + do not type the quotes and do not type a @key{RET} afterward. + +@samp{>>} in the margin means it is really time to try a command. + +@node Help-P, Help-^L, Help, Getting Started +@comment node-name, next, previous, up +@section Returning to the Previous node + +This node is called @samp{Help-P}. The @samp{Previous} node, as you see, +is @samp{Help}, which is the one you just came from using the @kbd{n} +command. Another @kbd{n} command now would take you to the next +node, @samp{Help-^L}. + +>> But do not do that yet. First, try the @kbd{p} command, which takes + you to the @samp{Previous} node. When you get there, you can do an + @kbd{n} again to return here. + + This all probably seems insultingly simple so far, but @emph{do not} be +led into skimming. Things will get more complicated soon. Also, +do not try a new command until you are told it is time to. Otherwise, +you may make Info skip past an important warning that was coming up. + +>> Now do an @kbd{n} to get to the node @samp{Help-^L} and learn more. + +@node Help-^L, Help-M, Help-P, Getting Started +@comment node-name, next, previous, up +@section The Space, Delete, B and ^L commands. + + This node's header tells you that you are now at node @samp{Help-^L}, and +that @kbd{p} would get you back to @samp{Help-P}. The node's title is +underlined; it says what the node is about (most nodes have titles). + + This is a big node and it does not all fit on your display screen. +You can tell that there is more that is not visible because you +can see the string @samp{--Top-----} rather than @samp{--All----} near +the bottom right corner of the screen. + + The Space, Delete and @kbd{B} commands exist to allow you to ``move +around'' in a node that does not all fit on the screen at once. +Space moves forward, to show what was below the bottom of the screen. +Delete moves backward, to show what was above the top of the screen +(there is not anything above the top until you have typed some spaces). + +>> Now try typing a Space (afterward, type a Delete to return here). + + When you type the space, the two lines that were at the bottom of +the screen appear at the top, followed by more lines. Delete takes +the two lines from the top and moves them to the bottom, +@emph{usually}, but if there are not a full screen's worth of lines +above them they may not make it all the way to the bottom. + + If you type Space when there is no more to see, it rings the +bell and otherwise does nothing. The same goes for Delete when +the header of the node is visible. + + If your screen is ever garbaged, you can tell Info to print it out +again by typing @kbd{C-l} (@kbd{Control-L}, that is---hold down ``Control'' and +type an @key{L} or @kbd{l}). + +>> Type @kbd{C-l} now. + + To move back to the beginning of the node you are on, you can type +a lot of Deletes. You can also type simply @kbd{b} for beginning. +>> Try that now. (We have put in enough verbiage to push this past +the first screenful, but screens are so big nowadays that perhaps it +isn't enough. You may need to shrink your Emacs or Info window.) +Then come back, with Spaces. + + If your screen is very tall, all of this node might fit at once. +In that case, "b" won't do anything. Sorry; what can we do? + + You have just learned a considerable number of commands. If you +want to use one but have trouble remembering which, you should type +a @key{?} which prints out a brief list of commands. When you are +finished looking at the list, make it go away by pressing @key{SPC} +repeatedly. + +>> Type a @key{?} now. Press @key{SPC} to see consecutive screenfuls of +>> the list until finished. + + From now on, you will encounter large nodes without warning, and +will be expected to know how to use Space and Delete to move +around in them without being told. Since not all terminals have +the same size screen, it would be impossible to warn you anyway. + +>> Now type @kbd{n} to see the description of the @kbd{m} command. + +@node Help-M, Help-Adv, Help-^L, Getting Started +@comment node-name, next, previous, up +@section Menus + +Menus and the @kbd{m} command + + With only the @kbd{n} and @kbd{p} commands for moving between nodes, nodes +are restricted to a linear sequence. Menus allow a branching +structure. A menu is a list of other nodes you can move to. It is +actually just part of the text of the node formatted specially so that +Info can interpret it. The beginning of a menu is always identified +by a line which starts with @samp{* Menu:}. A node contains a menu if and +only if it has a line in it which starts that way. The only menu you +can use at any moment is the one in the node you are in. To use a +menu in any other node, you must move to that node first. + + After the start of the menu, each line that starts with a @samp{*} +identifies one subtopic. The line usually contains a brief name +for the subtopic (followed by a @samp{:}), the name of the node that talks +about that subtopic, and optionally some further description of the +subtopic. Lines in the menu that do not start with a @samp{*} have no +special meaning---they are only for the human reader's benefit and do +not define additional subtopics. Here is an example: + +@example +* Foo: FOO's Node This tells about FOO +@end example + +The subtopic name is Foo, and the node describing it is @samp{FOO's Node}. +The rest of the line is just for the reader's Information. +[[ But this line is not a real menu item, simply because there is +no line above it which starts with @samp{* Menu:}.]] + + When you use a menu to go to another node (in a way that will be +described soon), what you specify is the subtopic name, the first +thing in the menu line. Info uses it to find the menu line, extracts +the node name from it, and goes to that node. The reason that there +is both a subtopic name and a node name is that the node name must be +meaningful to the computer and may therefore have to be ugly looking. +The subtopic name can be chosen just to be convenient for the user to +specify. Often the node name is convenient for the user to specify +and so both it and the subtopic name are the same. There is an +abbreviation for this: + +@example +* Foo:: This tells about FOO +@end example + +@noindent +This means that the subtopic name and node name are the same; they are +both @samp{Foo}. + +>> Now use Spaces to find the menu in this node, then come back to + the front with a @kbd{b} and some Spaces. As you see, a menu is + actually visible in its node. If you cannot find a menu in a node + by looking at it, then the node does not have a menu and the + @kbd{m} command is not available. + + The command to go to one of the subnodes is @kbd{m}---but @emph{do +not do it yet!} Before you use @kbd{m}, you must understand the +difference between commands and arguments. So far, you have learned +several commands that do not need arguments. When you type one, Info +processes it and is instantly ready for another command. The @kbd{m} +command is different: it is incomplete without the @dfn{name of the +subtopic}. Once you have typed @kbd{m}, Info tries to read the +subtopic name. + + Now look for the line containing many dashes near the bottom of the +screen. There is one more line beneath that one, but usually it is +blank. If it is empty, Info is ready for a command, such as @kbd{n} +or @kbd{b} or Space or @kbd{m}. If that line contains text ending +in a colon, it mean Info is trying to read the @dfn{argument} to a +command. At such times, commands do not work, because Info tries to +use them as the argument. You must either type the argument and +finish the command you started, or type @kbd{Control-g} to cancel the +command. When you have done one of those things, the line becomes +blank again. + + The command to go to a subnode via a menu is @kbd{m}. After you type +the @kbd{m}, the line at the bottom of the screen says @samp{Menu item: }. +You must then type the name of the subtopic you want, and end it with +a @key{RET}. + + You can abbreviate the subtopic name. If the abbreviation is not +unique, the first matching subtopic is chosen. Some menus put +the shortest possible abbreviation for each subtopic name in capital +letters, so you can see how much you need to type. It does not +matter whether you use upper case or lower case when you type the +subtopic. You should not put any spaces at the end, or inside of the +item name, except for one space where a space appears in the item in +the menu. + + You can also use the @dfn{completion} feature to help enter the subtopic +name. If you type the Tab key after entering part of a name, it will +magically fill in more of the name---as much as follows uniquely from +what you have entered. + + If you move the cursor to one of the menu subtopic lines, then you do +not need to type the argument: you just type a Return, and it stands for +the subtopic of the line you are on. + +Here is a menu to give you a chance to practice. + +* Menu: The menu starts here. + +This menu gives you three ways of going to one place, Help-FOO. + +* Foo: Help-FOO. A node you can visit for fun.@* +* Bar: Help-FOO. Strange! two ways to get to the same place.@* +* Help-FOO:: And yet another!@* + + +>> Now type just an @kbd{m} and see what happens: + + Now you are ``inside'' an @kbd{m} command. Commands cannot be used +now; the next thing you will type must be the name of a subtopic. + + You can change your mind about doing the @kbd{m} by typing Control-g. + +>> Try that now; notice the bottom line clear. + +>> Then type another @kbd{m}. + +>> Now type @samp{BAR} item name. Do not type Return yet. + + While you are typing the item name, you can use the Delete key to +cancel one character at a time if you make a mistake. + +>> Type one to cancel the @samp{R}. You could type another @samp{R} to + replace it. You do not have to, since @samp{BA} is a valid abbreviation. + +>> Now you are ready to go. Type a @key{RET}. + + After visiting Help-FOO, you should return here. + +>> Type @kbd{n} to see more commands. + +@c If a menu appears at the end of this node, remove it. +@c It is an accident of the menu updating command. + +Here is another way to get to Help-FOO, a menu. You can ignore this +if you want, or else try it (but then please come back to here). + +@menu +* Help-FOO:: +@end menu + +@node Help-FOO, , , Help-M +@comment node-name, next, previous, up +@subsection The @kbd{u} command + + Congratulations! This is the node @samp{Help-FOO}. Unlike the other +nodes you have seen, this one has an @samp{Up}: @samp{Help-M}, the node you +just came from via the @kbd{m} command. This is the usual +convention---the nodes you reach from a menu have @samp{Up} nodes that lead +back to the menu. Menus move Down in the tree, and @samp{Up} moves Up. +@samp{Previous}, on the other hand, is usually used to ``stay on the same +level but go backwards'' + + You can go back to the node @samp{Help-M} by typing the command +@kbd{u} for ``Up''. That puts you at the @emph{front} of the +node---to get back to where you were reading you have to type +some @key{SPC}s. + +>> Now type @kbd{u} to move back up to @samp{Help-M}. + +@node Help-Adv, Help-Q, Help-M, Getting Started +@comment node-name, next, previous, up +@section Some advanced Info commands + + The course is almost over, so please stick with it to the end. + + If you have been moving around to different nodes and wish to +retrace your steps, the @kbd{l} command (@kbd{l} for @dfn{last}) will +do that, one node-step at a time. As you move from node to node, Info +records the nodes where you have been in a special history list. The +@kbd{l} command revisits nodes in the history list; each successive +@kbd{l} command moves one step back through the history. + + If you have been following directions, ad @kbd{l} command now will get +you back to @samp{Help-M}. Another @kbd{l} command would undo the +@kbd{u} and get you back to @samp{Help-FOO}. Another @kbd{l} would undo +the @kbd{m} and get you back to @samp{Help-M}. + +>> Try typing three @kbd{l}'s, pausing in between to see what each + @kbd{l} does. + +Then follow directions again and you will end up back here. + + Note the difference between @kbd{l} and @kbd{p}: @kbd{l} moves to +where @emph{you} last were, whereas @kbd{p} always moves to the node +which the header says is the @samp{Previous} node (from this node, to +@samp{Help-M}). + + The @samp{d} command gets you instantly to the Directory node. +This node, which is the first one you saw when you entered Info, +has a menu which leads (directly, or indirectly through other menus), +to all the nodes that exist. + +>> Try doing a @samp{d}, then do an @kbd{l} to return here (yes, + @emph{do} return). + + Sometimes, in Info documentation, you will see a cross reference. +Cross references look like this: @xref{Help-Cross, Cross}. That is a +real, live cross reference which is named @samp{Cross} and points at +the node named @samp{Help-Cross}. + + If you wish to follow a cross reference, you must use the @samp{f} +command. The @samp{f} must be followed by the cross reference name +(in this case, @samp{Cross}). While you enter the name, you can use the +Delete key to edit your input. If you change your mind about following +any reference, you can use @kbd{Control-g} to cancel the command. + + Completion is available in the @samp{f} command; you can complete among +all the cross reference names in the current node by typing a Tab. + +>> Type @samp{f}, followed by @samp{Cross}, and a @key{RET}. + + To get a list of all the cross references in the current node, you can +type @kbd{?} after an @samp{f}. The @samp{f} continues to await a +cross reference name even after printing the list, so if you don't +actually want to follow a reference, you should type a @kbd{Control-g} +to cancel the @samp{f}. + +>> Type "f?" to get a list of the cross references in this node. Then + type a @kbd{Control-g} and see how the @samp{f} gives up. + +>> Now type @kbd{n} to see the last node of the course. + +@c If a menu appears at the end of this node, remove it. +@c It is an accident of the menu updating command. + +@node Help-Cross, , , Help-Adv +@comment node-name, next, previous, up +@unnumberedsubsec The node reached by the cross reference in Info + + This is the node reached by the cross reference named @samp{Cross}. + + While this node is specifically intended to be reached by a cross +reference, most cross references lead to nodes that ``belong'' +someplace else far away in the structure of Info. So you cannot expect +the footnote to have a @samp{Next}, @samp{Previous} or @samp{Up} pointing back to +where you came from. In general, the @kbd{l} (el) command is the only +way to get back there. + +>> Type @kbd{l} to return to the node where the cross reference was. + +@node Help-Q, , Help-Adv, Getting Started +@comment node-name, next, previous, up +@section Quitting Info + + To get out of Info, back to what you were doing before, type @kbd{q} +for @dfn{Quit}. + + This is the end of the course on using Info. There are some other +commands that are meant for experienced users; they are useful, and you +can find them by looking in the directory node for documentation on +Info. Finding them will be a good exercise in using Info in the usual +manner. + +>> Type @samp{d} to go to the Info directory node; then type + @samp{mInfo} and Return, to get to the node about Info and + see what other help is available. + +@node Advanced Info, Create an Info File, Getting Started, Top +@comment node-name, next, previous, up +@chapter Info for Experts + +This chapter describes various advanced Info commands, and how to write +an Info as distinct from a Texinfo file. (However, in most cases, writing a +Texinfo file is better, since you can use it @emph{both} to generate an +Info file and to make a printed manual. @xref{Top,, Overview of +Texinfo, texinfo, Texinfo: The GNU Documentation Format}.) + +@menu +* Expert:: Advanced Info commands: g, s, e, and 1 - 5. +* Add:: Describes how to add new nodes to the hierarchy. + Also tells what nodes look like. +* Menus:: How to add to or create menus in Info nodes. +* Cross-refs:: How to add cross-references to Info nodes. +* Tags:: How to make tag tables for Info files. +* Checking:: Checking an Info File +* Emacs Info Variables:: Variables modifying the behavior of Emacs Info. +@end menu + +@node Expert, Add, , Advanced Info +@comment node-name, next, previous, up +@section Advanced Info Commands + +@kbd{g}, @kbd{s}, @kbd{1}, -- @kbd{9}, and @kbd{e} + +If you know a node's name, you can go there by typing @kbd{g}, the +name, and @key{RET}. Thus, @kbd{gTop@key{RET}} would go to the node +called @samp{Top} in this file (its directory node). +@kbd{gExpert@key{RET}} would come back here. + +Unlike @kbd{m}, @kbd{g} does not allow the use of abbreviations. + +To go to a node in another file, you can include the filename in the +node name by putting it at the front, in parentheses. Thus, +@kbd{g(dir)Top@key{RET}} would go to the Info Directory node, which is +node @samp{Top} in the file @file{dir}. + +The node name @samp{*} specifies the whole file. So you can look at +all of the current file by typing @kbd{g*@key{RET}} or all of any +other file with @kbd{g(FILENAME)@key{RET}}. + +The @kbd{s} command allows you to search a whole file for a string. +It switches to the next node if and when that is necessary. You +type @kbd{s} followed by the string to search for, terminated by +@key{RET}. To search for the same string again, just @kbd{s} followed +by @key{RET} will do. The file's nodes are scanned in the order +they are in in the file, which has no necessary relationship to the +order that they may be in in the tree structure of menus and @samp{next} pointers. +But normally the two orders are not very different. In any case, +you can always do a @kbd{b} to find out what node you have reached, if +the header is not visible (this can happen, because @kbd{s} puts your +cursor at the occurrence of the string, not at the beginning of the +node). + +If you grudge the system each character of type-in it requires, you +might like to use the commands @kbd{1}, @kbd{2}, @kbd{3}, @kbd{4}, ... +@kbd{9}. They are short for the @kbd{m} command together with an +argument. @kbd{1} goes through the first item in the current node's +menu; @kbd{2} goes through the second item, etc. + +If you display supports multiple fonts, and you are using Emacs' Info +mode to read Info files, the @samp{*} for the fifth menu item is +underlines, and so is the @samp{*} for the ninth item; these underlines +make it easy to see at a glance which number to use for an item. + +On ordinary terminals, you won't have underlining. If you need to +actually count items, it is better to use @kbd{m} instead, and specify +the name. + +The Info command @kbd{e} changes from Info mode to an ordinary +Emacs editing mode, so that you can edit the text of the current node. +Type @kbd{C-c C-c} to switch back to Info. The @kbd{e} command is allowed +only if the variable @code{Info-enable-edit} is non-@code{nil}. + +@node Add, Menus, Expert, Advanced Info +@comment node-name, next, previous, up +@section Adding a new node to Info + +To add a new topic to the list in the Info directory, you must: +@enumerate +@item +Create some nodes, in some file, to document that topic. +@item +Put that topic in the menu in the directory. @xref{Menus, Menu}. +@end enumerate + +Usually, the way to create the nodes is with Texinfo @pxref{Top,, Overview of +Texinfo, texinfo, Texinfo: The GNU Documentation Format}); this has the +advantage that you can also make a printed manual from them. However, +if hyou want to edit an Info file, here is how. + + The new node can live in an existing documentation file, or in a new +one. It must have a @key{^_} character before it (invisible to the +user; this node has one but you cannot see it), and it ends with either +a @key{^_}, a @key{^L}, or the end of file. Note: If you put in a +@key{^L} to end a new node, be sure that there is a @key{^_} after it +to start the next one, since @key{^L} cannot @emph{start} a node. +Also, a nicer way to make a node boundary be a page boundary as well +is to put a @key{^L} @emph{right after} the @key{^_}. + + The @key{^_} starting a node must be followed by a newline or a +@key{^L} newline, after which comes the node's header line. The +header line must give the node's name (by which Info finds it), +and state the names of the @samp{Next}, @samp{Previous}, and @samp{Up} nodes (if +there are any). As you can see, this node's @samp{Up} node is the node +@samp{Top}, which points at all the documentation for Info. The @samp{Next} +node is @samp{Menus}. + + The keywords @dfn{Node}, @dfn{Previous}, @dfn{Up}, and @dfn{Next}, +may appear in any order, anywhere in the header line, but the +recommended order is the one in this sentence. Each keyword must be +followed by a colon, spaces and tabs, and then the appropriate name. +The name may be terminated with a tab, a comma, or a newline. A space +does not end it; node names may contain spaces. The case of letters +in the names is insignificant. + + A node name has two forms. A node in the current file is named by +what appears after the @samp{Node: } in that node's first line. For +example, this node's name is @samp{Add}. A node in another file is +named by @samp{(@var{filename})@var{node-within-file}}, as in +@samp{(info)Add} for this node. If the file name starts with ``./'', +then it is relative to the current directory; otherwise, it is relative +starting from the standard Info file directory of your site. +The name @samp{(@var{filename})Top} can be abbreviated to just +@samp{(@var{filename})}. By convention, the name @samp{Top} is used for +the ``highest'' node in any single file---the node whose @samp{Up} points +out of the file. The Directory node is @file{(dir)}. The @samp{Top} node +of a document file listed in the Directory should have an @samp{Up: +(dir)} in it. + + The node name @kbd{*} is special: it refers to the entire file. +Thus, @kbd{g*} shows you the whole current file. The use of the +node @kbd{*} is to make it possible to make old-fashioned, +unstructured files into nodes of the tree. + + The @samp{Node:} name, in which a node states its own name, must not +contain a filename, since Info when searching for a node does not +expect one to be there. The @samp{Next}, @samp{Previous} and @samp{Up} names may +contain them. In this node, since the @samp{Up} node is in the same file, +it was not necessary to use one. + + Note that the nodes in this file have a file name in the header +line. The file names are ignored by Info, but they serve as comments +to help identify the node for the user. + +@node Menus, Cross-refs, Add, Advanced Info +@comment node-name, next, previous, up +@section How to Create Menus + + Any node in the Info hierarchy may have a @dfn{menu}---a list of subnodes. +The @kbd{m} command searches the current node's menu for the topic which it +reads from the terminal. + + A menu begins with a line starting with @samp{* Menu:}. The rest of the +line is a comment. After the starting line, every line that begins +with a @samp{* } lists a single topic. The name of the topic--the +argument that the user must give to the @kbd{m} command to select this +topic---comes right after the star and space, and is followed by a +colon, spaces and tabs, and the name of the node which discusses that +topic. The node name, like node names following @samp{Next}, @samp{Previous} +and @samp{Up}, may be terminated with a tab, comma, or newline; it may also +be terminated with a period. + + If the node name and topic name are the same, then rather than +giving the name twice, the abbreviation @samp{* NAME::} may be used +(and should be used, whenever possible, as it reduces the visual +clutter in the menu). + + It is considerate to choose the topic names so that they differ +from each other very near the beginning---this allows the user to type +short abbreviations. In a long menu, it is a good idea to capitalize +the beginning of each item name which is the minimum acceptable +abbreviation for it (a long menu is more than 5 or so entries). + + The nodes listed in a node's menu are called its ``subnodes'', and +it is their ``superior''. They should each have an @samp{Up:} pointing at +the superior. It is often useful to arrange all or most of the +subnodes in a sequence of @samp{Next} and @samp{Previous} pointers so that someone who +wants to see them all need not keep revisiting the Menu. + + The Info Directory is simply the menu of the node @samp{(dir)Top}---that +is, node @samp{Top} in file @file{.../info/dir}. You can put new entries +in that menu just like any other menu. The Info Directory is @emph{not} the +same as the file directory called @file{info}. It happens that many of +Info's files live on that file directory, but they do not have to; and +files on that directory are not automatically listed in the Info +Directory node. + + Also, although the Info node graph is claimed to be a ``hierarchy'', +in fact it can be @emph{any} directed graph. Shared structures and +pointer cycles are perfectly possible, and can be used if they are +appropriate to the meaning to be expressed. There is no need for all +the nodes in a file to form a connected structure. In fact, this file +has two connected components. You are in one of them, which is under +the node @samp{Top}; the other contains the node @samp{Help} which the +@kbd{h} command goes to. In fact, since there is no garbage +collector, nothing terrible happens if a substructure is not pointed +to, but such a substructure is rather useless since nobody can +ever find out that it exists. + +@node Cross-refs, Tags, Menus, Advanced Info +@comment node-name, next, previous, up +@section Creating Cross References + + A cross reference can be placed anywhere in the text, unlike a menu +item which must go at the front of a line. A cross reference looks +like a menu item except that it has @samp{*note} instead of @kbd{*}. +It @emph{cannot} be terminated by a @samp{)}, because @samp{)}'s are +so often part of node names. If you wish to enclose a cross reference +in parentheses, terminate it with a period first. Here are two +examples of cross references pointers: + +@example +*Note details: commands. (See *note 3: Full Proof.) +@end example + +They are just examples. The places they ``lead to'' do not really exist! + +@node Tags, Checking, Cross-refs, Advanced Info +@comment node-name, next, previous, up +@section Tag Tables for Info Files + + You can speed up the access to nodes of a large Info file by giving +it a tag table. Unlike the tag table for a program, the tag table for +an Info file lives inside the file itself and is used +automatically whenever Info reads in the file. + + To make a tag table, go to a node in the file using Emacs Info mode and type +@kbd{M-x Info-tagify}. Then you must use @kbd{C-x C-s} to save the +file. + + Once the Info file has a tag table, you must make certain it is up +to date. If, as a result of deletion of text, any node moves back +more than a thousand characters in the file from the position +recorded in the tag table, Info will no longer be able to find that +node. To update the tag table, use the @code{Info-tagify} command again. + + An Info file tag table appears at the end of the file and looks like +this: + +@example +^_ +Tag Table: +File: info, Node: Cross-refs^?21419 +File: info, Node: Tags^?22145 +^_ +End Tag Table +@end example + +@noindent +Note that it contains one line per node, and this line contains +the beginning of the node's header (ending just after the node name), +a Delete character, and the character position in the file of the +beginning of the node. + +@node Checking, Emacs Info Variables, Tags, Advanced Info +@comment node-name, next, previous, up +@section Checking an Info File + + When creating an Info file, it is easy to forget the name of a node +when you are making a pointer to it from another node. If you put in +the wrong name for a node, this is not detected until someone +tries to go through the pointer using Info. Verification of the Info +file is an automatic process which checks all pointers to nodes and +reports any pointers which are invalid. Every @samp{Next}, @samp{Previous}, and +@samp{Up} is checked, as is every menu item and every cross reference. In +addition, any @samp{Next} which does not have a @samp{Previous} pointing back is +reported. Only pointers within the file are checked, because checking +pointers to other files would be terribly slow. But those are usually +few. + + To check an Info file, do @kbd{M-x Info-validate} while looking at +any node of the file with Emacs Info mode. + +@node Emacs Info Variables, , Checking, Advanced Info +@section Emacs Info-mode Variables + +The following variables may modify the behaviour of Info-mode in Emacs; +you may wish to set one or several of these variables interactively, or +in your @file{~/.emacs} init file. @xref{Examining, Examining and Setting +Variables, Examining and Setting Variables, emacs, The GNU Emacs +Manual}. + +@vtable @code +@item Info-enable-edit +Set to @code{nil}, disables the @samp{e} (@code{Info-edit}) command. A +non-@code{nil} value enables it. @xref{Add, Edit}. + +@item Info-enable-active-nodes +When set to a non-@code{nil} value, allows Info to execute Lisp code +associated with nodes. The Lisp code is executed when the node is +selected. + +@item Info-directory-list +The list of directories to search for Info files. Each element is a +string (directory name) or @code{nil} (try default directory). + +@item Info-directory +The standard directory for Info documentation files. Only used when the +function @code{Info-directory} is called. +@end vtable + +@node Create an Info File, , Advanced Info, Top +@comment node-name, next, previous, up +@chapter Creating an Info File from a Makeinfo file + +@code{makeinfo} is a utility that converts a Texinfo file into an Info +file; @code{texinfo-format-region} and @code{texinfo-format-buffer} are +GNU Emacs functions that do the same. + +@xref{Create an Info File, , Creating an Info File, texinfo, the Texinfo +Manual}, to learn how to create an Info file from a Texinfo file. + +@xref{Top,, Overview of Texinfo, texinfo, Texinfo: The GNU Documentation +Format}, to learn how to write a Texinfo file. + +@bye diff --git a/gnu/usr.bin/texinfo/doc/macro.texi b/gnu/usr.bin/texinfo/doc/macro.texi new file mode 100644 index 00000000000..8a3fe802392 --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/macro.texi @@ -0,0 +1,177 @@ +@c This file is included in makeinfo.texi. +@c +@ifinfo +@comment Here are some useful examples of the macro facility. + +@c Simply insert the right version of the texinfo name. +@macro texinfo{} +TeXinfo +@end macro + +@macro dfn{text} +@dfn{\text\} +@cpindex \text\ +@end macro + +@c Define a macro which expands to a pretty version of the name of the +@c Makeinfo program. +@macro makeinfo{} +@code{Makeinfo} +@end macro + +@c Define a macro which is used to define other macros. This one makes +@c a macro which creates a node and gives it a sectioning command. Note +@c that the created macro uses the original definition within the +@c expansion text. This takes advantage of the non-recursion feature of +@c macro execution. +@macro node_define{orig-name} +@macro \orig-name\{title} +@node \title\ +@\orig-name\ \title\ +@end macro +@end macro + +@c Now actually define a new set of sectioning commands. +@node_define {chapter} +@node_define {section} +@node_define {subsection} +@end ifinfo + +@chapter The Macro Facility + +This chapter describes the new macro facility. + +A @dfn{macro} is a command that you define in terms of other commands. +It doesn't exist as a @texinfo{} command until you define it as part of +the input file to @makeinfo{}. Once the command exists, it behaves much +as any other @texinfo{} command. Macros are a useful way to ease the +details and tedium of writing a `correct' info file. The following +sections explain how to write and invoke macros. + +@menu +* How to Use Macros in @texinfo{}:: + How to use the macro facility. + +* Using Macros Recursively:: + How to write a macro which does (or doesn't) recurse. + +* Using @texinfo{} Macros As Arguments:: + Passing a macro as an argument. +@end menu + +@section How to Use Macros in @texinfo{} + +Using macros in @texinfo{} is easy. First you define the macro. After +that, the macro command is available as a normal @texinfo{} command. +Here is what a definition looks like: + +@example +@@macro @var{name}@{@var{arg1}, @var{@dots{}} @var{argn}@} +@var{@texinfo{} commands@dots{}} +@@end macro +@end example + +The arguments that you specify that the macro takes are expanded with +the actual parameters used when calling the macro if they are seen +surrounded by backslashes. For example, here is a definition of +@code{@@codeitem}, a macro which can be used wherever @code{@@item} can +be used, but which surrounds its argument with @code{@@code@{@dots{}@}}. + +@example +@@macro codeitem@{item@} +@@item @@code@{\item\@} +@@end macro +@end example + +When the macro is expanded, all of the text between the @code{@@macro} +and @code{@@end macro} is inserted into the document at the expansion +point, with the actual parameters substituted for the named parameters. +So, a call to the above macro might look like: + +@example +@@codeitem@{Foo@} +@end example + +and @makeinfo{} would execute the following code: + +@example +@@item @@code@{Foo@} +@end example + +A special case is made for macros which only take a single argument, and +which are invoked without any brace characters (i.e., +@samp{@{}@dots{}@samp{@}}) surrounding an argument; the rest of the line +is supplied as is as the sole argument to the macro. This special case +allows one to redefine some standard @texinfo{} commands without +modifying the input file. Along with the non-recursive action of macro +invocation, one can easily redefine the sectioning commands to also +provide index entries: + +@example +@@macro chapter@{name@} +@@chapter \name\ +@@findex \name\ +@@end macro +@end example + +Thus, the text: + +@example +@@chapter strlen +@end example + +will expand to: + +@example +@@chapter strlen +@@findex strlen +@end example + +@section Using Macros Recursively + +Normally, while a particular macro is executing, any call to that macro +will be seen as a call to a builtin @texinfo{} command. This allows one +to redefine a builtin @texinfo{} command as a macro, and then use that +command within the definition of the macro itself. For example, one +might wish to make sure that whereever a term was defined with +@code{@@dfn@{@dots{}@}}, the location of the definition would appear +in the concept index for the manual. Here is a macro which redefines +@code{@@dfn} to do just that: + +@example +@@macro dfn@{text@} +@@dfn@{\text\@} +@@cpindex \text\ +@@end macro +@end example + +Note that we used the builtin @texinfo{} command @code{@@dfn} within our +overriding macro definition. + +This behaviour itself can be overridden for macro execution by writing a +special @dfn{macro control command} in the definition of the macro. The +command is considered special because it doesn't affect the output text +directly, rather, it affects the way in which the macro is defined. One +such special command is @code{@@allow-recursion}. + +@example +@@macro silly@{arg@} +@@allow-recursion +\arg\ +@@end macro +@end example + +Now @code{@@silly} is a macro that can be used within a call to itself: + +@example +This text @@silly@{@@silly@{some text@}@} is ``some text''. +@end example + +@section Using @texinfo{} Macros As Arguments + +@printindex cp +How to use @texinfo{} macros as arguments to other @texinfo{} macros. + +@bye + + diff --git a/gnu/usr.bin/texinfo/doc/texinfo.tex b/gnu/usr.bin/texinfo/doc/texinfo.tex new file mode 100644 index 00000000000..ec9b7029432 --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/texinfo.tex @@ -0,0 +1,4935 @@ +%% TeX macros to handle Texinfo files. +%% $Id: texinfo.tex,v 1.1 1997/08/01 22:01:12 kstailey 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. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi + +% This automatically updates the version number based on RCS. +\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} +\deftexinfoversion$Revision: 1.1 $ +\message{Loading texinfo package [Version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}\message{} + \catcode`+=\active \catcode`\_=\active} + +% Save some parts of plain tex whose names we will redefine. + +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv = \equiv +\let\ptexi=\i +\let\ptexlbrace=\{ +\let\ptexrbrace=\} +\let\ptexstar=\* +\let\ptext=\t + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + + +\message{Basics,} +\chardef\other=12 + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Set up fixed words for English. +\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% +\def\putwordInfo{Info}% +\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% +\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% +\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% +\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% +\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% +\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% +\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% +\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% +\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% + +% Ignore a token. +% +\def\gobble#1{} + +\hyphenation{ap-pen-dix} +\hyphenation{mini-buf-fer mini-buf-fers} +\hyphenation{eshell} +\hyphenation{white-space} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen \bindingoffset +\newdimen \normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{\tracingcommands2 \tracingstats2 + \tracingpages1 \tracingoutput1 \tracinglostchars1 + \tracingmacros2 \tracingparagraphs1 \tracingrestores1 + \showboxbreadth\maxdimen\showboxdepth\maxdimen +}% + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\cornerlong \newdimen\cornerthick +\newdimen\topandbottommargin +\newdimen\outerhsize \newdimen\outervsize +\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks +\outerhsize=7in +%\outervsize=9.5in +% Alternative @smallbook page size is 9.25in +\outervsize=9.25in +\topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \escapechar = `\\ % use backslash in output files. + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + \shipout\vbox{% + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \turnoffactive + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg#1{% + \let\next = #1% + \begingroup + \obeylines + \futurelet\temp\parseargx +} + +% If the next token is an obeyed space (from an @example environment or +% the like), remove it and recurse. Otherwise, we're done. +\def\parseargx{% + % \obeyedspace is defined far below, after the definition of \sepspaces. + \ifx\obeyedspace\temp + \expandafter\parseargdiscardspace + \else + \expandafter\parseargline + \fi +} + +% Remove a single space (as the delimiter token to the macro call). +{\obeyspaces % + \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + % + % First remove any @c comment, then any @comment. + % Result of each macro is put in \toks0. + \argremovec #1\c\relax % + \expandafter\argremovecomment \the\toks0 \comment\relax % + % + % Call the caller's macro, saved as \next in \parsearg. + \expandafter\next\expandafter{\the\toks0}% + }% +} + +% Since all \c{,omment} does is throw away the argument, we can let TeX +% do that for us. The \relax here is matched by the \relax in the call +% in \parseargline; it could be more or less anything, its purpose is +% just to delimit the argument to the \c. +\def\argremovec#1\c#2\relax{\toks0 = {#1}} +\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} + +% \argremovec{,omment} might leave us with trailing spaces, though; e.g., +% @end itemize @c foo +% will have two active spaces as part of the argument with the +% `itemize'. Here we remove all active spaces from #1, and assign the +% result to \toks0. +% +% This loses if there are any *other* active characters besides spaces +% in the argument -- _ ^ +, for example -- since they get expanded. +% Fortunately, Texinfo does not define any such commands. (If it ever +% does, the catcode of the characters in questionwill have to be changed +% here.) But this means we cannot call \removeactivespaces as part of +% \argremovec{,omment}, since @c uses \parsearg, and thus the argument +% that \parsearg gets might well have any character at all in it. +% +\def\removeactivespaces#1{% + \begingroup + \ignoreactivespaces + \edef\temp{#1}% + \global\toks0 = \expandafter{\temp}% + \endgroup +} + +% Change the active space to expand to nothing. +% +\begingroup + \obeyspaces + \gdef\ignoreactivespaces{\obeyspaces\let =\empty} +\endgroup + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +%% These are used to keep @begin/@end levels from running away +%% Call \inENV within environments (after a \begingroup) +\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} +\def\ENVcheck{% +\ifENV\errmessage{Still within an environment. Type Return to continue.} +\endgroup\fi} % This is not perfect, but it should reduce lossage + +% @begin foo is the same as @foo, for now. +\newhelp\EMsimple{Type <Return> to continue.} + +\outer\def\begin{\parsearg\beginxxx} + +\def\beginxxx #1{% +\expandafter\ifx\csname #1\endcsname\relax +{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else +\csname #1\endcsname\fi} + +% @end foo executes the definition of \Efoo. +% +\def\end{\parsearg\endxxx} +\def\endxxx #1{% + \removeactivespaces{#1}% + \edef\endthing{\the\toks0}% + % + \expandafter\ifx\csname E\endthing\endcsname\relax + \expandafter\ifx\csname \endthing\endcsname\relax + % There's no \foo, i.e., no ``environment'' foo. + \errhelp = \EMsimple + \errmessage{Undefined command `@end \endthing'}% + \else + \unmatchedenderror\endthing + \fi + \else + % Everything's ok; the right environment has been started. + \csname E\endthing\endcsname + \fi +} + +% There is an environment #1, but it hasn't been started. Give an error. +% +\def\unmatchedenderror#1{% + \errhelp = \EMsimple + \errmessage{This `@end #1' doesn't have a matching `@#1'}% +} + +% Define the control sequence \E#1 to give an unmatched @end error. +% +\def\defineunmatchedend#1{% + \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% +} + + +% Single-spacing is done by various environments (specifically, in +% \nonfillstart and \quotations). +\newskip\singlespaceskip \singlespaceskip = 12.5pt +\def\singlespace{% + % Why was this kern here? It messes up equalizing space above and below + % environments. --karl, 6may93 + %{\advance \baselineskip by -\singlespaceskip + %\kern \baselineskip}% + \setleading \singlespaceskip +} + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt \char '100}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt \char '173}} +\def\myrbrace {{\tt \char '175}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce actual \{ & \} command in an index. + \catcode`\{ = 12 \catcode`\} = 12 + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\@ = 0 \catcode`\\ = 12 + @gdef@lbracecmd[\{]% + @gdef@rbracecmd[\}]% +@endgroup + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown +% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @enddots{} is an end-of-sentence ellipsis. +\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} + +% @! is an end-of-sentence bang. +\gdef\!{!\spacefactor=3000 } + +% @? is an end-of-sentence query. +\gdef\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +\def\group{\begingroup + \ifnum\catcode13=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + % + % The \vtop we start below produces a box with normal height and large + % depth; thus, TeX puts \baselineskip glue before it, and (when the + % next line of text is done) \lineskip glue after it. (See p.82 of + % the TeXbook.) Thus, space below is not quite equal to space + % above. But it's pretty close. + \def\Egroup{% + \egroup % End the \vtop. + \endgroup % End the \group. + }% + % + \vtop\bgroup + % We have to put a strut on the last line in case the @group is in + % the midst of an example, rather than completely enclosing it. + % Otherwise, the interline space between the last line of the group + % and the first line afterwards is too small. But we can't put the + % strut in \Egroup, since there it would be on a line by itself. + % Hence this just inserts a strut at the beginning of each line. + \everypar = {\strut}% + % + % Since we have a strut on every line, we don't need any of TeX's + % normal interline spacing. + \offinterlineskip + % + % OK, but now we have to do something about blank + % lines in the input in @example-like environments, which normally + % just turn into \lisppar, which will insert no space now that we've + % turned off the interline space. Simplest is to make them be an + % empty paragraph. + \ifx\par\lisppar + \edef\par{\leavevmode \par}% + % + % Reset ^^M's definition to new definition of \par. + \obeylines + \fi + % + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +\def\need{\parsearg\needx} + +% Old definition--didn't work. +%\def\needx #1{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 +%\prevdepth=-1000pt +%}} + +\def\needx#1{% + % Go into vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % Don't add any leading before our big empty box, but allow a page + % break, since the best break might be right here. + \allowbreak + \nointerlineskip + \vtop to #1\mil{\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak +} + +% @br forces paragraph break + +\let\br = \par + +% @dots{} output some dots + +\def\dots{$\ldots$} + +% @page forces the start of a new page + +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\def\exdent{\parsearg\exdentyyy} +\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} + +% This defn is used inside nofill environments such as @example. +\def\nofillexdent{\parsearg\nofillexdentyyy} +\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount +\leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. + +\def\inmargin#1{% +\strut\vadjust{\nobreak\kern-\strutdepth + \vtop to \strutdepth{\baselineskip\strutdepth\vss + \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} + +%\hbox{{\rm#1}}\hfil\break}} + +% @include file insert text of that file as input. +% Allow normal characters that we make active in the argument (a file name). +\def\include{\begingroup + \catcode`\\=12 + \catcode`~=12 + \catcode`^=12 + \catcode`_=12 + \catcode`|=12 + \catcode`<=12 + \catcode`>=12 + \catcode`+=12 + \parsearg\includezzz} +% Restore active chars for included file. +\def\includezzz#1{\endgroup\begingroup + % Read the included file in a group so nested @include's work. + \def\thisfile{#1}% + \input\thisfile +\endgroup} + +\def\thisfile{} + +% @center line outputs that line, centered + +\def\center{\parsearg\centerzzz} +\def\centerzzz #1{{\advance\hsize by -\leftskip +\advance\hsize by -\rightskip +\centerline{#1}}} + +% @sp n outputs n lines of vertical space + +\def\sp{\parsearg\spxxx} +\def\spxxx #1{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% +\parsearg \commentxxx} + +\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } + +\let\c=\comment + +% @paragraphindent is defined for the Info formatting commands only. +\let\paragraphindent=\comment + +% Prevent errors for section commands. +% Used in @ignore and in failing conditionals. +\def\ignoresections{% +\let\chapter=\relax +\let\unnumbered=\relax +\let\top=\relax +\let\unnumberedsec=\relax +\let\unnumberedsection=\relax +\let\unnumberedsubsec=\relax +\let\unnumberedsubsection=\relax +\let\unnumberedsubsubsec=\relax +\let\unnumberedsubsubsection=\relax +\let\section=\relax +\let\subsec=\relax +\let\subsubsec=\relax +\let\subsection=\relax +\let\subsubsection=\relax +\let\appendix=\relax +\let\appendixsec=\relax +\let\appendixsection=\relax +\let\appendixsubsec=\relax +\let\appendixsubsection=\relax +\let\appendixsubsubsec=\relax +\let\appendixsubsubsection=\relax +\let\contents=\relax +\let\smallbook=\relax +\let\titlepage=\relax +} + +% Used in nested conditionals, where we have to parse the Texinfo source +% and so want to turn off most commands, in case they are used +% incorrectly. +% +\def\ignoremorecommands{% + \let\defcodeindex = \relax + \let\defcv = \relax + \let\deffn = \relax + \let\deffnx = \relax + \let\defindex = \relax + \let\defivar = \relax + \let\defmac = \relax + \let\defmethod = \relax + \let\defop = \relax + \let\defopt = \relax + \let\defspec = \relax + \let\deftp = \relax + \let\deftypefn = \relax + \let\deftypefun = \relax + \let\deftypevar = \relax + \let\deftypevr = \relax + \let\defun = \relax + \let\defvar = \relax + \let\defvr = \relax + \let\ref = \relax + \let\xref = \relax + \let\printindex = \relax + \let\pxref = \relax + \let\settitle = \relax + \let\setchapternewpage = \relax + \let\setchapterstyle = \relax + \let\everyheading = \relax + \let\evenheading = \relax + \let\oddheading = \relax + \let\everyfooting = \relax + \let\evenfooting = \relax + \let\oddfooting = \relax + \let\headings = \relax + \let\include = \relax + \let\lowersections = \relax + \let\down = \relax + \let\raisesections = \relax + \let\up = \relax + \let\set = \relax + \let\clear = \relax + \let\item = \relax +} + +% Ignore @ignore ... @end ignore. +% +\def\ignore{\doignore{ignore}} + +% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. +% +\def\ifinfo{\doignore{ifinfo}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifnottex{\doignore{ifnottex}} +\def\html{\doignore{html}} +\def\menu{\doignore{menu}} +\def\direntry{\doignore{direntry}} + +% Also ignore @macro ... @end macro. The user must run texi2dvi, +% which runs makeinfo to do macro expansion. Ignore @unmacro, too. +\def\macro{\doignore{macro}} +\let\unmacro = \comment + + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory = \comment + +% Ignore text until a line `@end #1'. +% +\def\doignore#1{\begingroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define a command to swallow text until we reach `@end #1'. + \long\def\doignoretext##1\end #1{\enddoignore}% + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \catcode32 = 10 + % + % Ignore braces, too, so mismatched braces don't cause trouble. + \catcode`\{ = 9 + \catcode`\} = 9 + % + % And now expand that command. + \doignoretext +} + +% What we do to finish off ignored text. +% +\def\enddoignore{\endgroup\ignorespaces}% + +\newif\ifwarnedobs\warnedobsfalse +\def\obstexwarn{% + \ifwarnedobs\relax\else + % We need to warn folks that they may have trouble with TeX 3.0. + % This uses \immediate\write16 rather than \message to get newlines. + \immediate\write16{} + \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} + \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} + \immediate\write16{If you are running another version of TeX, relax.} + \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} + \immediate\write16{ Then upgrade your TeX installation if you can.} + \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)} + \immediate\write16{If you are stuck with version 3.0, run the} + \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} + \immediate\write16{ to use a workaround.} + \immediate\write16{} + \global\warnedobstrue + \fi +} + +% **In TeX 3.0, setting text in \nullfont hangs tex. For a +% workaround (which requires the file ``dummy.tfm'' to be installed), +% uncomment the following line: +%%%%%\font\nullfont=dummy\let\obstexwarn=\relax + +% Ignore text, except that we keep track of conditional commands for +% purposes of nesting, up to an `@end #1' command. +% +\def\nestedignore#1{% + \obstexwarn + % We must actually expand the ignored text to look for the @end + % command, so that nested ignore constructs work. Thus, we put the + % text into a \vbox and then do nothing with the result. To minimize + % the change of memory overflow, we follow the approach outlined on + % page 401 of the TeXbook: make the current font be a dummy font. + % + \setbox0 = \vbox\bgroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define `@end #1' to end the box, which will in turn undefine the + % @end command again. + \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% + % + % We are going to be parsing Texinfo commands. Most cause no + % trouble when they are used incorrectly, but some commands do + % complicated argument parsing or otherwise get confused, so we + % undefine them. + % + % We can't do anything about stray @-signs, unfortunately; + % they'll produce `undefined control sequence' errors. + \ignoremorecommands + % + % Set the current font to be \nullfont, a TeX primitive, and define + % all the font commands to also use \nullfont. We don't use + % dummy.tfm, as suggested in the TeXbook, because not all sites + % might have that installed. Therefore, math mode will still + % produce output, but that should be an extremely small amount of + % stuff compared to the main input. + % + \nullfont + \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont + \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont + \let\tensf = \nullfont + % Similarly for index fonts (mostly for their use in + % smallexample) + \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont + \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont + \let\indsf = \nullfont + % + % Don't complain when characters are missing from the fonts. + \tracinglostchars = 0 + % + % Don't bother to do space factor calculations. + \frenchspacing + % + % Don't report underfull hboxes. + \hbadness = 10000 + % + % Do minimal line-breaking. + \pretolerance = 10000 + % + % Do not execute instructions in @tex + \def\tex{\doignore{tex}}% +} + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. Make sure the catcode of space is correct to avoid +% losing inside @example, for instance. +% +\def\set{\begingroup\catcode` =10 + \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. + \parsearg\setxxx} +\def\setxxx#1{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + \def\temp{#2}% + \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty + \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. + \fi + \endgroup +} +% Can't use \xdef to pre-expand #2 and save some time, since \temp or +% \next or other control sequences that we've defined might get us into +% an infinite loop. Consider `@set foo @cite{bar}'. +\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\def\clear{\parsearg\clearxxx} +\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} + +% @value{foo} gets the text saved in variable foo. +% +\def\value{\begingroup + \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. + \valuexxx} +\def\valuexxx#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {\{No value for ``#1''\}}% + \else + \csname SET#1\endcsname + \fi +\endgroup} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +\def\ifset{\parsearg\ifsetxxx} +\def\ifsetxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifsetfail + \else + \expandafter\ifsetsucceed + \fi +} +\def\ifsetsucceed{\conditionalsucceed{ifset}} +\def\ifsetfail{\nestedignore{ifset}} +\defineunmatchedend{ifset} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +\def\ifclear{\parsearg\ifclearxxx} +\def\ifclearxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifclearsucceed + \else + \expandafter\ifclearfail + \fi +} +\def\ifclearsucceed{\conditionalsucceed{ifclear}} +\def\ifclearfail{\nestedignore{ifclear}} +\defineunmatchedend{ifclear} + +% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text +% following, through the first @end iftex (etc.). Make `@end iftex' +% (etc.) valid only after an @iftex. +% +\def\iftex{\conditionalsucceed{iftex}} +\def\ifnothtml{\conditionalsucceed{ifnothtml}} +\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} +\defineunmatchedend{iftex} +\defineunmatchedend{ifnothtml} +\defineunmatchedend{ifnotinfo} + +% We can't just want to start a group at @iftex (for example) and end it +% at @end iftex, since then @set commands inside the conditional have no +% effect (they'd get reverted at the end of the group). So we must +% define \Eiftex to redefine itself to be its previous value. (We can't +% just define it to fail again with an ``unmatched end'' error, since +% the @ifset might be nested.) +% +\def\conditionalsucceed#1{% + \edef\temp{% + % Remember the current value of \E#1. + \let\nece{prevE#1} = \nece{E#1}% + % + % At the `@end #1', redefine \E#1 to be its previous value. + \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% + }% + \temp +} + +% We need to expand lots of \csname's, but we don't want to expand the +% control sequences after we've constructed them. +% +\def\nece#1{\expandafter\noexpand\csname#1\endcsname} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math means output in math mode. +% We don't use $'s directly in the definition of \math because control +% sequences like \math are expanded when the toc file is written. Then, +% we read the toc file back, the $'s will be normal characters (as they +% should be, according to the definition of Texinfo). So we must use a +% control sequence to switch into and out of math mode. +% +% This isn't quite enough for @math to work properly in indices, but it +% seems unlikely it will ever be needed there. +% +\let\implicitmath = $ +\def\math#1{\implicitmath #1\implicitmath} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{\implicitmath\ptexbullet\implicitmath} +\def\minus{\implicitmath-\implicitmath} + +\def\node{\ENVcheck\parsearg\nodezzz} +\def\nodezzz#1{\nodexxx [#1,]} +\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} +\let\nwnode=\node +\let\lastnode=\relax + +\def\donoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\setref{\lastnode}\fi +\global\let\lastnode=\relax} + +\def\unnumbnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi +\global\let\lastnode=\relax} + +\def\appendixnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi +\global\let\lastnode=\relax} + +% @refill is a no-op. +\let\refill=\relax + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \readauxfile + \opencontents + \openindices + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \global\let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + % Just to be on the safe side, close the input stream before the \input. + \openin 1 texinfo.cnf + \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi + \closein1 + \temp + % + \comment % Ignore the actual filename. +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + +% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx} +% \def\macroxxx#1#2 \end macro{% +% \expandafter\gdef\macrotemp#1{#2}% +% \endgroup} + +%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx} +%\def\linemacroxxx#1#2 \end linemacro{% +%\let\parsearg=\relax +%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}% +%\expandafter\xdef\macrotemp{\parsearg\macrotempx}% +%\expandafter\gdef\macrotempx#1{#2}% +%\endgroup} + +%\def\butfirst#1{} + + +\message{fonts,} + +% Font-change commands. + +% Texinfo supports the sans serif font style, which plain TeX does not. +% So we set up a \sf analogous to plain's \rm, etc. +\newfam\sffam +\def\sf{\fam=\sffam \tensf} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this one. +\def\ttsl{\tenttsl} + +% Use Computer Modern fonts at \magstephalf (11pt). +\newcount\mainmagstep +\mainmagstep=\magstephalf + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +\ifx\bigger\relax +\let\mainmagstep=\magstep1 +\setfont\textrm\rmshape{12}{1000} +\setfont\texttt\ttshape{12}{1000} +\else +\setfont\textrm\rmshape{10}{\mainmagstep} +\setfont\texttt\ttshape{10}{\mainmagstep} +\fi +% Instead of cmb10, you many want to use cmbx10. +% cmbx10 is a prettier font on its own, but cmb10 +% looks better when embedded in a line with cmr10. +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun, etc. +\setfont\defbf\bxshape{10}{\magstep1} %was 1314 +\setfont\deftt\ttshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} + +% Fonts for indices and small examples (9pt). +% We actually use the slanted font rather than the italic, +% because texinfo normally uses the slanted fonts for that. +% Do not make many font distinctions in general in the index, since they +% aren't very useful. +\setfont\ninett\ttshape{9}{1000} +\setfont\indrm\rmshape{9}{1000} +\setfont\indit\slshape{9}{1000} +\let\indsl=\indit +\let\indtt=\ninett +\let\indttsl=\ninett +\let\indsf=\indrm +\let\indbf=\indrm +\setfont\indsc\scshape{10}{900} +\font\indi=cmmi9 +\font\indsy=cmsy9 + +% Fonts for title page: +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} + +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. +% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. +% \setfont\ssecsl\slshape{10}{\magstep1} +% \setfont\ssectt\ttshape{10}{\magstep1} +% \setfont\ssecsf\sfshape{10}{\magstep1} + +%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. +%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than +%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. +%\setfont\ssectt\ttshape{10}{1315} +%\setfont\ssecsf\sfshape{10}{1315} + +%\let\ssecbf=\ssecrm + +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{\magstep1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +% The smallcaps and symbol fonts should actually be scaled \magstep1.5, +% but that is not a standard magnification. + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts, we +% don't bother to reset \scriptfont and \scriptscriptfont (which would +% also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy + \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf + \textfont\ttfam = \tentt \textfont\sffam = \tensf +} + + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this so that font changes will continue to work +% in math mode, where it is the current \fam that is relevant in most +% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam +% \tenbf}, for example. By redefining \tenbf, we obviate the need to +% redefine \bf itself. +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl + \resetmathfonts} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? +\def\indexfonts{% + \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl + \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc + \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl + \resetmathfonts \setleading{12pt}} + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bxshape{12}{1000} +\setfont\shortcontsl\slshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} +\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartitalic +\let\dfn=\smartitalic +\let\emph=\smartitalic +\let\cite=\smartitalic + +\def\b#1{{\bf #1}} +\let\strong=\b + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\let\ttfont=\t +\def\samp #1{`\tclose{#1}'\null} +\setfont\smallrm\rmshape{8}{1000} +\font\smallsy=cmsy9 +\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% + \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{$\rangle$}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +\let\file=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in \code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ +\catcode`\-=\active +\catcode`\_=\active +\catcode`\|=\active +\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} +% The following is used by \doprintindex to insure that long function names +% wrap around. It is necessary for - and _ to be active before the index is +% read from the file, as \entry parses the arguments long before \code is +% ever called. -- mycroft +% _ is always active; and it shouldn't be \let = to an _ that is a +% subscript character anyway. Then, @cindex @samp{_} (for example) +% fails. --karl +\global\def\indexbreaks{% + \catcode`\-=\active \let-\realdash +} +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} +\def\codex #1{\tclose{#1}\endgroup} + +%\let\exp=\tclose %Was temporary + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\def\kbdinputstyle{\parsearg\kbdinputstylexxx} +\def\kbdinputstylexxx#1{% + \def\arg{#1}% + \ifx\arg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\arg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\arg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is kbdinputdistinct. (Too much of a hassle to call the macro, +% the catcodes are wrong for parsearg to work.) +\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% @url. Quotes do not seem necessary, so use \code. +\let\url=\code + +% @uref (abbreviation for `urlref') takes an optional second argument +% specifying the text to display. First (mandatory) arg is the url. +% Perhaps eventually put in a hypertex \special here. +% +\def\uref#1{\urefxxx #1,,\finish} +\def\urefxxx#1,#2,#3\finish{% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \unhbox0\ (\code{#1})% + \else + \code{#1}% + \fi +} + +% rms does not like the angle brackets --karl, 17may97. +% So now @email is just like @uref. +%\def\email#1{$\langle${\tt #1}$\rangle$} +\let\email=\uref + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of +% @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +\def\r#1{{\rm #1}} % roman font +% Use of \lowercase was suggested. +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @pounds{} is a sterling sign. +\def\pounds{{\it\$}} + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +\def\shorttitlepage{\parsearg\shorttitlepagezzz} +\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\def\titlepage{\begingroup \parindent=0pt \textfonts + \let\subtitlerm=\tenrm +% I deinstalled the following change because \cmr12 is undefined. +% This change was not in the ChangeLog anyway. --rms. +% \let\subtitlerm=\cmr12 + \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% + % + \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% + % + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % + % Now you can print the title using @title. + \def\title{\parsearg\titlezzz}% + \def\titlezzz##1{\leftline{\titlefonts\rm ##1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Now you can put text using @subtitle. + \def\subtitle{\parsearg\subtitlezzz}% + \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% + % + % @author should come last, but may come many times. + \def\author{\parsearg\authorzzz}% + \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi + {\authorfont \leftline{##1}}}% + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \oldpage + \let\page = \oldpage + \hbox{}}% +% \def\page{\oldpage \hbox{}} +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + \HEADINGSon +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks \evenheadline % Token sequence for heading line of even pages +\newtoks \oddheadline % Token sequence for heading line of odd pages +\newtoks \evenfootline % Token sequence for footing line of even pages +\newtoks \oddfootline % Token sequence for footing line of odd pages + +% Now make Tex use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + +\def\evenheading{\parsearg\evenheadingxxx} +\def\oddheading{\parsearg\oddheadingxxx} +\def\everyheading{\parsearg\everyheadingxxx} + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\oddfooting{\parsearg\oddfootingxxx} +\def\everyfooting{\parsearg\everyfootingxxx} + +{\catcode`\@=0 % + +\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} +\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} +\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} +\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} +\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} +% +}% unbind the catcode of @. + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{ +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{ +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{ +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% Produces Day Month Year style of output. +\def\today{\number\day\space +\ifcase\month\or +January\or February\or March\or April\or May\or June\or +July\or August\or September\or October\or November\or December\fi +\space\number\year} + +% Use this if you want the Month Day, Year style of output. +%\def\today{\ifcase\month\or +%January\or February\or March\or April\or May\or June\or +%July\or August\or September\or October\or November\or December\fi +%\space\number\day, \number\year} + +% @settitle line... specifies the title of the document, for headings +% It generates no output of its own + +\def\thistitle{No Title} +\def\settitle{\parsearg\settitlezzz} +\def\settitlezzz #1{\gdef\thistitle{#1}} + + +\message{tables,} + +% @tabs -- simple alignment + +% These don't work. For one thing, \+ is defined as outer. +% So these macros cannot even be defined. + +%\def\tabs{\parsearg\tabszzz} +%\def\tabszzz #1{\settabs\+#1\cr} +%\def\tabline{\parsearg\tablinezzz} +%\def\tablinezzz #1{\+#1\cr} +%\def\&{&} + +% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @vtable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} + +\def\internalBkitem{\smallbreak \parsearg\kitemzzz} +\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} + +\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% + \itemzzz {#1}} + +\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% + \itemzzz {#1}} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemfont{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % Be sure we are not still in the middle of a paragraph. + %{\parskip = 0in + %\par + %}% + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue. + \nobreak + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. Since that + % text will be indented by \tableindent, we make the item text be in + % a zero-width box. + \noindent + \rlap{\hskip -\tableindent\box0}\ignorespaces% + \endgroup% + \itemxneedsnegativevskiptrue% + \fi +} + +\def\item{\errmessage{@item while not in a table}} +\def\itemx{\errmessage{@itemx while not in a table}} +\def\kitem{\errmessage{@kitem while not in a table}} +\def\kitemx{\errmessage{@kitemx while not in a table}} +\def\xitem{\errmessage{@xitem while not in a table}} +\def\xitemx{\errmessage{@xitemx while not in a table}} + +%% Contains a kludge to get @end[description] to work +\def\description{\tablez{\dontindex}{1}{}{}{}{}} + +\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} +{\obeylines\obeyspaces% +\gdef\tablex #1^^M{% +\tabley\dontindex#1 \endtabley}} + +\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} +{\obeylines\obeyspaces% +\gdef\ftablex #1^^M{% +\tabley\fnitemindex#1 \endtabley +\def\Eftable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} +{\obeylines\obeyspaces% +\gdef\vtablex #1^^M{% +\tabley\vritemindex#1 \endtabley +\def\Evtable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\dontindex #1{} +\def\fnitemindex #1{\doind {fn}{\code{#1}}}% +\def\vritemindex #1{\doind {vr}{\code{#1}}}% + +{\obeyspaces % +\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% +\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} + +\def\tablez #1#2#3#4#5#6{% +\aboveenvbreak % +\begingroup % +\def\Edescription{\Etable}% Necessary kludge. +\let\itemindex=#1% +\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % +\ifnum 0#4>0 \tableindent=#4\mil \fi % +\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % +\def\itemfont{#2}% +\itemmax=\tableindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \tableindent % +\exdentamount=\tableindent +\parindent = 0pt +\parskip = \smallskipamount +\ifdim \parskip=0pt \parskip=2pt \fi% +\def\Etable{\endgraf\afterenvbreak\endgroup}% +\let\item = \internalBitem % +\let\itemx = \internalBitemx % +\let\kitem = \internalBkitem % +\let\kitemx = \internalBkitemx % +\let\xitem = \internalBxitem % +\let\xitemx = \internalBxitemx % +} + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\def\itemize{\parsearg\itemizezzz} + +\def\itemizezzz #1{% + \begingroup % ended by the @end itemsize + \itemizey {#1}{\Eitemize} +} + +\def\itemizey #1#2{% +\aboveenvbreak % +\itemmax=\itemindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \itemindent % +\exdentamount=\itemindent +\parindent = 0pt % +\parskip = \smallskipamount % +\ifdim \parskip=0pt \parskip=2pt \fi% +\def#2{\endgraf\afterenvbreak\endgroup}% +\def\itemcontents{#1}% +\let\item=\itemizeitem} + +% Set sfcode to normal for the chars that usually have another value. +% These are `.?!:;,' +\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 + \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\def\enumerate{\parsearg\enumeratezzz} +\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + \begingroup % ended by the @end enumerate + % + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a <number>. + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call itemizey, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \itemizey{#1.}\Eenumerate\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + +% Definition of @item while inside @itemize. + +\def\itemizeitem{% +\advance\itemno by 1 +{\let\par=\endgraf \smallbreak}% +\ifhmode \errmessage{In hmode at itemizeitem}\fi +{\parskip=0in \hskip 0pt +\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% +\vadjust{\penalty 1200}}% +\flushcr} + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. +% +% For those who want to use more than one line's worth of words in +% the preamble, break the line within one argument and it +% will parse correctly, i.e., +% +% @multitable {Column 1 template} {Column 2 template} {Column 3 +% template} +% Not: +% @multitable {Column 1 template} {Column 2 template} +% {Column 3 template} + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab, @multitable or @end multitable do not need to be on their +% own lines, but it will not hurt if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. + +%%%% +% Dimensions + +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +%%%% +% Macros used to set up halign preamble: +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +%% 2/1/96, to allow fractions to be given with more than one digit. +\def\pickupwholefraction#1 {\global\advance\colcount by1 % +\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% +\setuptable} + +\newcount\colcount +\def\setuptable#1{\def\firstarg{#1}% +\ifx\firstarg\xendsetuptable\let\go\relax% +\else + \ifx\firstarg\xcolumnfractions\global\setpercenttrue% + \else + \ifsetpercent + \let\go\pickupwholefraction % In this case arg of setuptable + % is the decimal point before the + % number given in percent of hsize. + % We don't need this so we don't use it. + \else + \global\advance\colcount by1 + \setbox0=\hbox{#1 }% Add a normal word space as a separator; + % typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi% + \fi% +\ifx\go\pickupwholefraction\else\let\go\setuptable\fi% +\fi\go} + +%%%% +% multitable syntax +\def\tab{&\hskip1sp\relax} % 2/2/96 + % tiny skip here makes sure this column space is + % maintained, even if it is never used. + + +%%%% +% @multitable ... @end multitable definitions: + +\def\multitable{\parsearg\dotable} + +\def\dotable#1{\bgroup +\let\item\cr +\tolerance=9500 +\hbadness=9500 +\setmultitablespacing +\parskip=\multitableparskip +\parindent=\multitableparindent +\overfullrule=0pt +\global\colcount=0\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=0\relax% + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. +\halign\bgroup&\global\advance\colcount by 1\relax% +\multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % If 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=1 +\else + \ifsetpercent + \else + % If user has <not> set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: +\leftskip=\multitablecolspace +\fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively marking + % characters. + \noindent\ignorespaces##\unskip\multistrut}\cr + % \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 pages. +% Maybe so, but it also creates really weird page breaks when the table +% breaks over pages Wouldn't \vfil be better? Wait until the problem +% manifests itself, so it can be fixed for real --karl. +\global\colcount=0\relax}} +} + +\def\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\else +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \fi +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. + +\def\newindex #1{ +\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\doindex {#1}} +} + +% @defindex foo == \newindex{foo} + +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. + +\def\newcodeindex #1{ +\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\docodeindex {#1}} +} + +\def\defcodeindex{\parsearg\newcodeindex} + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +\def\synindex #1 #2 {% +\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname +\expandafter\let\csname#1indfile\endcsname=\synindexfoo +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\doindex {#2}}% +} + +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +\def\syncodeindex #1 #2 {% +\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname +\expandafter\let\csname#1indfile\endcsname=\synindexfoo +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\docodeindex {#2}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +\def\indexdummies{% +% Take care of the plain tex accent commands. +\def\"{\realbackslash "}% +\def\`{\realbackslash `}% +\def\'{\realbackslash '}% +\def\^{\realbackslash ^}% +\def\~{\realbackslash ~}% +\def\={\realbackslash =}% +\def\b{\realbackslash b}% +\def\c{\realbackslash c}% +\def\d{\realbackslash d}% +\def\u{\realbackslash u}% +\def\v{\realbackslash v}% +\def\H{\realbackslash H}% +% Take care of the plain tex special European modified letters. +\def\oe{\realbackslash oe}% +\def\ae{\realbackslash ae}% +\def\aa{\realbackslash aa}% +\def\OE{\realbackslash OE}% +\def\AE{\realbackslash AE}% +\def\AA{\realbackslash AA}% +\def\o{\realbackslash o}% +\def\O{\realbackslash O}% +\def\l{\realbackslash l}% +\def\L{\realbackslash L}% +\def\ss{\realbackslash ss}% +% Take care of texinfo commands likely to appear in an index entry. +% (Must be a way to avoid doing expansion at all, and thus not have to +% laboriously list every single command here.) +\def\@{@}% will be @@ when we switch to @ as escape char. +%\let\{ = \lbracecmd +%\let\} = \rbracecmd +\def\_{{\realbackslash _}}% +\def\w{\realbackslash w }% +\def\bf{\realbackslash bf }% +%\def\rm{\realbackslash rm }% +\def\sl{\realbackslash sl }% +\def\sf{\realbackslash sf}% +\def\tt{\realbackslash tt}% +\def\gtr{\realbackslash gtr}% +\def\less{\realbackslash less}% +\def\hat{\realbackslash hat}% +%\def\char{\realbackslash char}% +\def\TeX{\realbackslash TeX}% +\def\dots{\realbackslash dots }% +\def\result{\realbackslash result}% +\def\equiv{\realbackslash equiv}% +\def\expansion{\realbackslash expansion}% +\def\print{\realbackslash print}% +\def\error{\realbackslash error}% +\def\point{\realbackslash point}% +\def\copyright{\realbackslash copyright}% +\def\tclose##1{\realbackslash tclose {##1}}% +\def\code##1{\realbackslash code {##1}}% +\def\dotless##1{\realbackslash dotless {##1}}% +\def\samp##1{\realbackslash samp {##1}}% +\def\,##1{\realbackslash ,{##1}}% +\def\t##1{\realbackslash t {##1}}% +\def\r##1{\realbackslash r {##1}}% +\def\i##1{\realbackslash i {##1}}% +\def\b##1{\realbackslash b {##1}}% +\def\sc##1{\realbackslash sc {##1}}% +\def\cite##1{\realbackslash cite {##1}}% +\def\key##1{\realbackslash key {##1}}% +\def\file##1{\realbackslash file {##1}}% +\def\var##1{\realbackslash var {##1}}% +\def\kbd##1{\realbackslash kbd {##1}}% +\def\dfn##1{\realbackslash dfn {##1}}% +\def\emph##1{\realbackslash emph {##1}}% +\def\value##1{\realbackslash value {##1}}% +\unsepspaces +} + +% If an index command is used in an @example environment, any spaces +% therein should become regular spaces in the raw index file, not the +% expansion of \tie (\\leavevmode \penalty \@M \ ). +{\obeyspaces + \gdef\unsepspaces{\obeyspaces\let =\space}} + +% \indexnofonts no-ops all font-change commands. +% This is used when outputting the strings to sort the index by. +\def\indexdummyfont#1{#1} +\def\indexdummytex{TeX} +\def\indexdummydots{...} + +\def\indexnofonts{% +% Just ignore accents. +\let\,=\indexdummyfont +\let\"=\indexdummyfont +\let\`=\indexdummyfont +\let\'=\indexdummyfont +\let\^=\indexdummyfont +\let\~=\indexdummyfont +\let\==\indexdummyfont +\let\b=\indexdummyfont +\let\c=\indexdummyfont +\let\d=\indexdummyfont +\let\u=\indexdummyfont +\let\v=\indexdummyfont +\let\H=\indexdummyfont +\let\dotless=\indexdummyfont +% Take care of the plain tex special European modified letters. +\def\oe{oe}% +\def\ae{ae}% +\def\aa{aa}% +\def\OE{OE}% +\def\AE{AE}% +\def\AA{AA}% +\def\o{o}% +\def\O{O}% +\def\l{l}% +\def\L{L}% +\def\ss{ss}% +\let\w=\indexdummyfont +\let\t=\indexdummyfont +\let\r=\indexdummyfont +\let\i=\indexdummyfont +\let\b=\indexdummyfont +\let\emph=\indexdummyfont +\let\strong=\indexdummyfont +\let\cite=\indexdummyfont +\let\sc=\indexdummyfont +%Don't no-op \tt, since it isn't a user-level command +% and is used in the definitions of the active chars like <, >, |... +%\let\tt=\indexdummyfont +\let\tclose=\indexdummyfont +\let\code=\indexdummyfont +\let\file=\indexdummyfont +\let\samp=\indexdummyfont +\let\kbd=\indexdummyfont +\let\key=\indexdummyfont +\let\var=\indexdummyfont +\let\TeX=\indexdummytex +\let\dots=\indexdummydots +\def\@{@}% +} + +% To define \realbackslash, we must make \ not be an escape. +% We must first make another character (@) an escape +% so we do not become unable to do a definition. + +{\catcode`\@=0 \catcode`\\=\other +@gdef@realbackslash{\}} + +\let\indexbackslash=0 %overridden during \printindex. + +\let\SETmarginindex=\relax %initialize! +% workhorse for all \fooindexes +% #1 is name of index, #2 is stuff to put there +\def\doind #1#2{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% + \fi + {% + \count255=\lastpenalty + {% + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + {% + \let\folio=0% We will expand all macros now EXCEPT \folio. + \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % First process the index-string with all font commands turned off + % to get the string to sort by. + {\indexnofonts \xdef\indexsorttmp{#2}}% + % + % Now produce the complete index entry, with both the sort key and the + % original text, including any font commands. + \toks0 = {#2}% + \edef\temp{% + \write\csname#1indfile\endcsname{% + \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% + }% + \temp + }% + }% + \penalty\count255 + }% +} + +\def\dosubind #1#2#3{% +{\count10=\lastpenalty % +{\indexdummies % Must do this here, since \bf, etc expand at this stage +\escapechar=`\\% +{\let\folio=0% +\def\rawbackslashxx{\indexbackslash}% +% +% Now process the index-string once, with all font commands turned off, +% to get the string to sort the index by. +{\indexnofonts +\xdef\temp1{#2 #3}% +}% +% Now produce the complete index entry. We process the index-string again, +% this time with font commands expanded, to get what to print in the index. +\edef\temp{% +\write \csname#1indfile\endcsname{% +\realbackslash entry {\temp1}{\folio}{#2}{#3}}}% +\temp }% +}\penalty\count10}} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\def\printindex{\parsearg\doprintindex} +\def\doprintindex#1{\begingroup + \dobreak \chapheadingskip{10000}% + % + \indexfonts \rm + \tolerance = 9500 + \indexbreaks + % + % See if the index file exists and is nonempty. + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + (Index is nonexistent) + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + (Index is empty) + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\rawbackslashxx}% + \catcode`\\ = 0 + \catcode`\@ = 11 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +% Same as \bigskipamount except no shrink. +% \balancecolumns gets confused if there is any shrink. +\newskip\initialskipamount \initialskipamount 12pt plus4pt + +\def\initial #1{% +{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt +\ifdim\lastskip<\initialskipamount +\removelastskip \penalty-200 \vskip \initialskipamount\fi +\line{\secbf#1\hfill}\kern 2pt\penalty10000}} + +% This typesets a paragraph consisting of #1, dot leaders, and then #2 +% flush to the right margin. It is used for index and table of contents +% entries. The paragraph is indented by \leftskip. +% +\def\entry #1#2{\begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent=2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % Start a ``paragraph'' for the index entry so the line breaking + % parameters we've set above will have an effect. + \noindent + % + % Insert the text of the index entry. TeX will do line-breaking on it. + #1% + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#2}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd\ \else% + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ #2% The page number ends the paragraph. + \fi% + \par +\endgroup} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm + +\def\secondary #1#2{ +{\parfillskip=0in \parskip=0in +\hangindent =1in \hangafter=1 +\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {\global\setbox\partialpage = \vbox{% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case, we must prevent the second \partialpage from + % simply overwriting the first, causing us to lose the page. + % This will preserve it until a real output routine can ship it + % out. Generally, \partialpage will be empty when this runs and + % this will be a no-op. + \unvbox\partialpage + % + % Unvbox the main output page. + \unvbox255 + \kern-\topskip \kern\baselineskip + }}% + \eject + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +\def\pagesofar{% + % Re-output the contents of the output page -- any previous material, + % followed by the two boxes we just split. + \unvbox\partialpage + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% +} +\def\enddoublecolumns{% + \output = {\balancecolumns}\eject % split what we have + \endgroup % started in \begindoublecolumns + % + % Back to normal single-column typesetting, but take account of the + % fact that we just accumulated some stuff on the output page. + \pagegoal = \vsize +} +\def\balancecolumns{% + % Called at the end of the double column material. + \setbox0 = \vbox{\unvbox255}% + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {\vbadness=10000 \loop + \global\setbox3=\copy0 + \global\setbox1=\vsplit3 to\dimen@ + \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt + \repeat}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Define chapters, sections, etc. + +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +\def\appendixletter{\char\the\appendixno} + +\newwrite\contentsfile +% This is called from \setfilename. +\def\opencontents{\openout\contentsfile = \jobname.toc } + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise + +\def\thischapter{} \def\thissection{} +\def\seccheck#1{\ifnum \pageno<0 + \errmessage{@#1 not allowed after generating table of contents}% +\fi} + +\def\chapternofonts{% + \let\rawbackslash=\relax + \let\frenchspacing=\relax + \def\result{\realbackslash result}% + \def\equiv{\realbackslash equiv}% + \def\expansion{\realbackslash expansion}% + \def\print{\realbackslash print}% + \def\TeX{\realbackslash TeX}% + \def\dots{\realbackslash dots}% + \def\result{\realbackslash result}% + \def\equiv{\realbackslash equiv}% + \def\expansion{\realbackslash expansion}% + \def\print{\realbackslash print}% + \def\error{\realbackslash error}% + \def\point{\realbackslash point}% + \def\copyright{\realbackslash copyright}% + \def\tt{\realbackslash tt}% + \def\bf{\realbackslash bf}% + \def\w{\realbackslash w}% + \def\less{\realbackslash less}% + \def\gtr{\realbackslash gtr}% + \def\hat{\realbackslash hat}% + \def\char{\realbackslash char}% + \def\tclose##1{\realbackslash tclose{##1}}% + \def\code##1{\realbackslash code{##1}}% + \def\samp##1{\realbackslash samp{##1}}% + \def\r##1{\realbackslash r{##1}}% + \def\b##1{\realbackslash b{##1}}% + \def\key##1{\realbackslash key{##1}}% + \def\file##1{\realbackslash file{##1}}% + \def\kbd##1{\realbackslash kbd{##1}}% + % These are redefined because @smartitalic wouldn't work inside xdef. + \def\i##1{\realbackslash i{##1}}% + \def\cite##1{\realbackslash cite{##1}}% + \def\var##1{\realbackslash var{##1}}% + \def\emph##1{\realbackslash emph{##1}}% + \def\dfn##1{\realbackslash dfn{##1}}% +} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raise/lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% Choose a numbered-heading macro +% #1 is heading level if unmodified by @raisesections or @lowersections +% #2 is text for heading +\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \chapterzzz{#2} +\or + \seczzz{#2} +\or + \numberedsubseczzz{#2} +\or + \numberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \chapterzzz{#2} + \else + \numberedsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses appendix heading levels +\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \appendixzzz{#2} +\or + \appendixsectionzzz{#2} +\or + \appendixsubseczzz{#2} +\or + \appendixsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \appendixzzz{#2} + \else + \appendixsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses numberless heading levels +\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \unnumberedzzz{#2} +\or + \unnumberedseczzz{#2} +\or + \unnumberedsubseczzz{#2} +\or + \unnumberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \unnumberedzzz{#2} + \else + \unnumberedsubsubseczzz{#2} + \fi +\fi +} + + +\def\thischaptername{No Chapter Title} +\outer\def\chapter{\parsearg\chapteryyy} +\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz #1{\seccheck{chapter}% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% +\chapmacro {#1}{\the\chapno}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +% We don't substitute the actual chapter name into \thischapter +% because we don't want its macros evaluated now. +\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec +}} + +\outer\def\appendix{\parsearg\appendixyyy} +\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz #1{\seccheck{appendix}% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \appendixno by 1 \message{Appendix \appendixletter}% +\chapmacro {#1}{\putwordAppendix{} \appendixletter}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash chapentry{\the\toks0}% + {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\global\let\section = \appendixsec +\global\let\subsection = \appendixsubsec +\global\let\subsubsection = \appendixsubsubsec +}} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\def\centerchap{\parsearg\centerchapyyy} +\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} + +\outer\def\top{\parsearg\unnumberedyyy} +\outer\def\unnumbered{\parsearg\unnumberedyyy} +\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz #1{\seccheck{unnumbered}% +\secno=0 \subsecno=0 \subsubsecno=0 +% +% This used to be simply \message{#1}, but TeX fully expands the +% argument to \message. Therefore, if #1 contained @-commands, TeX +% expanded them. For example, in `@unnumbered The @cite{Book}', TeX +% expanded @cite (which turns out to cause errors because \cite is meant +% to be executed, not expanded). +% +% Anyway, we don't want the fully-expanded definition of @cite to appear +% as a result of the \message, we just want `@cite' itself. We use +% \the<toks register> to achieve this: TeX expands \the<toks> only once, +% simply yielding the contents of the <toks register>. +\toks0 = {#1}\message{(\the\toks0)}% +% +\unnumbchapmacro {#1}% +\gdef\thischapter{#1}\gdef\thissection{#1}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\global\let\section = \unnumberedsec +\global\let\subsection = \unnumberedsubsec +\global\let\subsubsection = \unnumberedsubsubsec +}} + +\outer\def\numberedsec{\parsearg\secyyy} +\def\secyyy #1{\numhead1{#1}} % normally calls seczzz +\def\seczzz #1{\seccheck{section}% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash secentry % +{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsection{\parsearg\appendixsecyyy} +\outer\def\appendixsec{\parsearg\appendixsecyyy} +\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz #1{\seccheck{appendixsection}% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash secentry % +{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} +\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% +\plainsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} +\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz #1{\seccheck{subsection}% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash subsecentry % +{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} +\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash subsecentry % +{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} +\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% +\plainsubsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} +\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash subsubsecentry{\the\toks0} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} + {\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} +\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash subsubsecentry{\the\toks0}% + {\appendixletter} + {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} +\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% +\plainsubsubsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\toks0 = {#1}% +\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +% These are variants which are not "outer", so they can appear in @ifinfo. +% Actually, they should now be obsolete; ordinary section commands should work. +\def\infotop{\parsearg\unnumberedzzz} +\def\infounnumbered{\parsearg\unnumberedzzz} +\def\infounnumberedsec{\parsearg\unnumberedseczzz} +\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} + +\def\infoappendix{\parsearg\appendixzzz} +\def\infoappendixsec{\parsearg\appendixseczzz} +\def\infoappendixsubsec{\parsearg\appendixsubseczzz} +\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} + +\def\infochapter{\parsearg\chapterzzz} +\def\infosection{\parsearg\sectionzzz} +\def\infosubsection{\parsearg\subsectionzzz} +\def\infosubsubsection{\parsearg\subsubsectionzzz} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and +% such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{\parsearg\majorheadingzzz} +\def\majorheadingzzz #1{% +{\advance\chapheadingskip by 10pt \chapbreak }% +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\chapheading{\parsearg\chapheadingzzz} +\def\chapheadingzzz #1{\chapbreak % +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +% @heading, @subheading, @subsubheading. +\def\heading{\parsearg\plainsecheading} +\def\subheading{\parsearg\plainsubsecheading} +\def\subsubheading{\parsearg\plainsubsubsecheading} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{ +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{ +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{ +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +\def\CHAPFplain{ +\global\let\chapmacro=\chfplain +\global\let\unnumbchapmacro=\unnchfplain +\global\let\centerchapmacro=\centerchfplain} + +% Plain chapter opening. +% #1 is the text, #2 the chapter number or empty if unnumbered. +\def\chfplain#1#2{% + \pchapsepmacro + {% + \chapfonts \rm + \def\chapnum{#2}% + \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% Plain opening for unnumbered. +\def\unnchfplain#1{\chfplain{#1}{}} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerchfplain#1{{% + \def\centerparametersmaybe{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt + }% + \chfplain{#1}{}% +}} + +\CHAPFplain % The default + +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 10000 % +} + +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} + +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 % +} + +\def\CHAPFopen{ +\global\let\chapmacro=\chfopen +\global\let\unnumbchapmacro=\unnchfopen +\global\let\centerchapmacro=\centerchfopen} + + +% Section titles. +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip {-1000}} +\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} +\def\plainsecheading#1{\sectionheading{sec}{}{#1}} + +% Subsection titles. +\newskip \subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} +\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} +\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} + +% Subsubsection titles. +\let\subsubsecheadingskip = \subsecheadingskip +\let\subsubsecheadingbreak = \subsecheadingbreak +\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} +\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} + + +% Print any size section title. +% +% #1 is the section type (sec/subsec/subsubsec), #2 is the section +% number (maybe empty), #3 the text. +\def\sectionheading#1#2#3{% + {% + \expandafter\advance\csname #1headingskip\endcsname by \parskip + \csname #1headingbreak\endcsname + }% + {% + % Switch to the right set of fonts. + \csname #1fonts\endcsname \rm + % + % Only insert the separating space if we have a section number. + \def\secnum{#2}% + \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% + % + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 % zero if no section number + \unhbox0 #3}% + }% + \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak +} + + +\message{toc printing,} +% Finish up the main text and prepare to read what we've written +% to \contentsfile. + +\newskip\contentsrightmargin \contentsrightmargin=1in +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund <tege@matematik.su.se> + \contentsalignmacro + \immediate\closeout \contentsfile + \ifnum \pageno>0 + \pageno = -1 % Request roman numbered pages. + \fi + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \unnumbchapmacro{#1}\def\thischapter{}% + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. +} + + +% Normal (long) toc. +\outer\def\contents{% + \startcontents{\putwordTableofContents}% + \input \jobname.toc + \endgroup + \vfill \eject +} + +% And just the chapters. +\outer\def\summarycontents{% + \startcontents{\putwordShortContents}% + % + \let\chapentry = \shortchapentry + \let\unnumbchapentry = \shortunnumberedentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\secentry ##1##2##3##4{} + \def\unnumbsecentry ##1##2{} + \def\subsecentry ##1##2##3##4##5{} + \def\unnumbsubsecentry ##1##2{} + \def\subsubsecentry ##1##2##3##4##5##6{} + \def\unnumbsubsubsecentry ##1##2{} + \input \jobname.toc + \endgroup + \vfill \eject +} +\let\shortcontents = \summarycontents + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapter-level things, for both the long and short contents. +\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} + +% See comments in \dochapentry re vbox and related settings +\def\shortchapentry#1#2#3{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% +} + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. +% We could simplify the code here by writing out an \appendixentry +% command in the toc file for appendices, instead of using \chapentry +% for both, but it doesn't seem worth it. +\setbox0 = \hbox{\shortcontrm \putwordAppendix } +\newdimen\shortappendixwidth \shortappendixwidth = \wd0 + +\def\shortchaplabel#1{% + % We typeset #1 in a box of constant width, regardless of the text of + % #1, so the chapter titles will come out aligned. + \setbox0 = \hbox{#1}% + \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi + % + % This space should be plenty, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + \advance\dimen0 by 1.1em + \hbox to \dimen0{#1\hfil}% +} + +\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} +\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} + +% Sections. +\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} +\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} + +% Subsections. +\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} +\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} + +% And subsubsections. +\def\subsubsecentry#1#2#3#4#5#6{% + \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} +\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} + +% This parameter controls the indentation of the various levels. +\newdimen\tocindent \tocindent = 3pc + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno{#2}}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +% Final typesetting of a toc entry; we use the same \entry macro as for +% the index entries, but we want to suppress hyphenation here. (We +% can't do that in the \entry macro, since index entries might consist +% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) +% +% \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 breaks + \entry{\turnoffactive #1}{\turnoffactive #2}% +\endgroup} + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\let\subsecentryfonts = \textfonts +\let\subsubsecentryfonts = \textfonts + + +\message{environments,} + +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% Furthermore, these definitions must come after we define our fonts. +\newbox\dblarrowbox \newbox\longdblarrowbox +\newbox\pushcharbox \newbox\bullbox +\newbox\equivbox \newbox\errorbox + +%{\tentt +%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} +%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} +%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} +%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} +% Adapted from the manmac format (p.420 of TeXbook) +%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex +% depth .1ex\hfil} +%} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% Adapted from the TeXbook's \boxit. +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} + +\global\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{ + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} + +% The @error{} command. +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\def\tex{\begingroup +\catcode `\\=0 \catcode `\{=1 \catcode `\}=2 +\catcode `\$=3 \catcode `\&=4 \catcode `\#=6 +\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie +\catcode `\%=14 +\catcode 43=12 % plus +\catcode`\"=12 +\catcode`\==12 +\catcode`\|=12 +\catcode`\<=12 +\catcode`\>=12 +\escapechar=`\\ +% +\let\,=\ptexcomma +\let\{=\ptexlbrace +\let\}=\ptexrbrace +\let\.=\ptexdot +\let\*=\ptexstar +\let\dots=\ptexdots +\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% +\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% +\def\@{@}% +\let\bullet=\ptexbullet +\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext +% +\let\Etex=\endgroup} + +% Define @lisp ... @endlisp. +% @lisp does a \begingroup so it can rebind things, +% including the definition of @endlisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% Make each space character in the input produce a normal interword +% space in the output. Don't allow a line break at this space, as this +% is used only in environments like @example, where each line of input +% should produce a line of output anyway. +% +{\obeyspaces % +\gdef\sepspaces{\obeyspaces\let =\tie}} + +% Define \obeyedspace to be our active space, whatever it is. This is +% for use in \parsearg. +{\sepspaces% +\global\let\obeyedspace= } + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip +% +\def\aboveenvbreak{{\advance\envskipamount by \parskip +\endgraf \ifdim\lastskip<\envskipamount +\removelastskip \penalty-50 \vskip\envskipamount \fi}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \cartouche: draw rectangle w/rounded corners around argument +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\long\def\cartouche{% +\begingroup + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt %we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18pt % allow for 3pt kerns on either +% side, and for 6pt waste from +% each corner char + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \hsize=\cartinner + \kern3pt + \begingroup + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip +\def\Ecartouche{% + \endgroup + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup +\endgroup +}} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \inENV % This group ends at the end of the body + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \singlespace + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \let\exdent=\nofillexdent + \let\nonarrowing=\relax + \fi +} + +% To ending an @example-like environment, we first end the paragraph +% (via \afterenvbreak's vertical glue), and then the group. That way we +% keep the zero \parskip that the environments set -- \parskip glue +% will be inserted at the beginning of the next paragraph in the +% document, after the environment. +% +\def\nonfillfinish{\afterenvbreak\endgroup}% + +\def\lisp{\begingroup + \nonfillstart + \let\Elisp = \nonfillfinish + \tt + % Make @kbd do something special, if requested. + \let\kbdfont\kbdexamplefont + \rawbackslash % have \ input char produce \ char from current font + \gobble +} + +% Define the \E... control sequence only if we are inside the +% environment, so the error checking in \end will work. +% +% We must call \lisp last in the definition, since it reads the +% return following the @example (or whatever) command. +% +\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} +\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} +\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} + +% @smallexample and @smalllisp. This is not used unless the @smallbook +% command is given. Originally contributed by Pavel@xerox. +% +\def\smalllispx{\begingroup + \nonfillstart + \let\Esmalllisp = \nonfillfinish + \let\Esmallexample = \nonfillfinish + % + % Smaller fonts for small examples. + \indexfonts \tt + \rawbackslash % make \ output the \ character from the current font (tt) + \gobble +} + +% This is @display; same as @lisp except use roman font. +% +\def\display{\begingroup + \nonfillstart + \let\Edisplay = \nonfillfinish + \gobble +} + +% This is @format; same as @display except don't narrow margins. +% +\def\format{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eformat = \nonfillfinish + \gobble +} + +% @flushleft (same as @format) and @flushright. +% +\def\flushleft{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushleft = \nonfillfinish + \gobble +} +\def\flushright{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushright = \nonfillfinish + \advance\leftskip by 0pt plus 1fill + \gobble} + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. +% +\def\quotation{% + \begingroup\inENV %This group ends at the end of the @quotation body + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \singlespace + \parindent=0pt + % We have retained a nonzero parskip for the environment, since we're + % doing normal filling. So to avoid extra space below the environment... + \def\Equotation{\parskip = 0pt \nonfillfinish}% + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi +} + +\message{defuns,} +% Define formatter for defuns +% First, allow user to change definition object font (\df) internally +\def\setdeffont #1 {\csname DEF#1\endcsname} + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deftypemargin \deftypemargin=12pt +\newskip\deflastargmargin \deflastargmargin=18pt + +\newcount\parencount +% define \functionparens, which makes ( and ) and & do special things. +% \functionparens affects the group it is contained in. +\def\activeparens{% +\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active +\catcode`\[=\active \catcode`\]=\active} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +\global\let(=\lparen \global\let)=\rparen +\global\let[=\lbrack \global\let]=\rbrack + +\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } +\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} +% This is used to turn on special parens +% but make & act ordinary (given that it's active). +\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} + +% Definitions of (, ) and & used in args for functions. +% This is the definition of ( outside of all parentheses. +\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested + \global\advance\parencount by 1 +} +% +% This is the definition of ( when already inside a level of parens. +\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% +\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. + % also in that case restore the outer-level definition of (. + \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi + \global\advance \parencount by -1 } +% If we encounter &foo, then turn on ()-hacking afterwards +\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } +% +\gdef\normalparens{\boldbrax\let&=\ampnr} +} % End of definition inside \activeparens +%% These parens (in \boldbrax) actually are a little bolder than the +%% contained text. This is especially needed for [ and ] +\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } +\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } +\def\ampnr{\&} +\def\lbrb{{\bf\char`\[}} +\def\rbrb{{\bf\char`\]}} + +% First, defname, which formats the header line itself. +% #1 should be the function name. +% #2 should be the type of definition, such as "Function". + +\def\defname #1#2{% +% Get the values of \leftskip and \rightskip as they were +% outside the @def... +\dimen2=\leftskip +\advance\dimen2 by -\defbodyindent +\dimen3=\rightskip +\advance\dimen3 by -\defbodyindent +\noindent % +\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% +\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line +\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations +\parshape 2 0in \dimen0 \defargsindent \dimen1 % +% Now output arg 2 ("Function" or some such) +% ending at \deftypemargin from the right margin, +% but stuck inside a box of width 0 so it does not interfere with linebreaking +{% Adjust \hsize to exclude the ambient margins, +% so that \rightline will obey them. +\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 +\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% +% Make all lines underfull and no complaints: +\tolerance=10000 \hbadness=10000 +\advance\leftskip by -\defbodyindent +\exdentamount=\defbodyindent +{\df #1}\enskip % Generate function name +} + +% Actually process the body of a definition +% #1 should be the terminating control sequence, such as \Edefun. +% #2 should be the "another name" control sequence, such as \defunx. +% #3 should be the control sequence that actually processes the header, +% such as \defunheader. + +\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % 61 is `=' +\obeylines\activeparens\spacesplit#3} + +\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} + +\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} + +% These parsing functions are similar to the preceding ones +% except that they do not make parens into active characters. +% These are used for "variables" since they have no arguments. + +\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % +\obeylines\spacesplit#3} + +% This is used for \def{tp,vr}parsebody. It could probably be used for +% some of the others, too, with some judicious conditionals. +% +\def\parsebodycommon#1#2#3{% + \begingroup\inENV % + \medbreak % + % Define the end token that this defining construct specifies + % so that it will exit this group. + \def#1{\endgraf\endgroup\medbreak}% + \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% + \parindent=0in + \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent + \exdentamount=\defbodyindent + \begingroup\obeylines +} + +\def\defvrparsebody#1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{#3{#4}}% +} + +% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the +% type is just `struct', because we lose the braces in `{struct +% termios}' when \spacesplit reads its undelimited argument. Sigh. +% \let\deftpparsebody=\defvrparsebody +% +% So, to get around this, we put \empty in with the type name. That +% way, TeX won't find exactly `{...}' as an undelimited argument, and +% won't strip off the braces. +% +\def\deftpparsebody #1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{\parsetpheaderline{#3{#4}}}\empty +} + +% Fine, but then we have to eventually remove the \empty *and* the +% braces (if any). That's what this does. +% +\def\removeemptybraces\empty#1\relax{#1} + +% After \spacesplit has done its work, this is called -- #1 is the final +% thing to call, #2 the type name (which starts with \empty), and #3 +% (which might be empty) the arguments. +% +\def\parsetpheaderline#1#2#3{% + #1{\removeemptybraces#2\relax}{#3}% +}% + +\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\spacesplit{#3{#5}}} + +% Split up #2 at the first space token. +% call #1 with two arguments: +% the first is all of #2 before the space token, +% the second is all of #2 after that space token. +% If #2 contains no space token, all of it is passed as the first arg +% and the second is passed as empty. + +{\obeylines +\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% +\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% +\ifx\relax #3% +#1{#2}{}\else #1{#2}{#3#4}\fi}} + +% So much for the things common to all kinds of definitions. + +% Define @defun. + +% First, define the processing that is wanted for arguments of \defun +% Use this to expand the args and terminate the paragraph they make up + +\def\defunargs #1{\functionparens \sl +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +\hyphenchar\tensl=0 +#1% +\hyphenchar\tensl=45 +\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +} + +\def\deftypefunargs #1{% +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% Use \boldbraxnoamp, not \functionparens, so that & is not special. +\boldbraxnoamp +\tclose{#1}% avoid \code because of side effects on active chars +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +} + +% Do complete processing of one @defun or @defunx line already parsed. + +% @deffn Command forward-char nchars + +\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} + +\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% +\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defun == @deffn Function + +\def\defun{\defparsebody\Edefun\defunx\defunheader} + +\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Function}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefun int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} + +% #1 is the data type. #2 is the name and args. +\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} +% #1 is the data type, #2 the name, #3 the args. +\def\deftypefunheaderx #1#2 #3\relax{% +\doind {fn}{\code{#2}}% Make entry in function index +\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% +\deftypefunargs {#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} + +% \defheaderxcond#1\relax$$$ +% puts #1 in @code, followed by a space, but does nothing if #1 is null. +\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} + +% #1 is the classification. #2 is the data type. #3 is the name and args. +\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} +% #1 is the classification, #2 the data type, #3 the name, #4 the args. +\def\deftypefnheaderx #1#2#3 #4\relax{% +\doind {fn}{\code{#3}}% Make entry in function index +\begingroup +\normalparens % notably, turn off `&' magic, which prevents +% at least some C++ text from working +\defname {\defheaderxcond#2\relax$$$#3}{#1}% +\deftypefunargs {#4}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defmac == @deffn Macro + +\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} + +\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Macro}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defspec == @deffn Special Form + +\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} + +\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Special Form}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% This definition is run if you use @defunx +% anywhere other than immediately after a @defun or @defunx. + +\def\deffnx #1 {\errmessage{@deffnx in invalid context}} +\def\defunx #1 {\errmessage{@defunx in invalid context}} +\def\defmacx #1 {\errmessage{@defmacx in invalid context}} +\def\defspecx #1 {\errmessage{@defspecx in invalid context}} +\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} +\def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}} +\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} + +% @defmethod, and so on + +% @defop {Funny Method} foo-class frobnicate argument + +\def\defop #1 {\def\defoptype{#1}% +\defopparsebody\Edefop\defopx\defopheader\defoptype} + +\def\defopheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index +\begingroup\defname {#2}{\defoptype{} on #1}% +\defunargs {#3}\endgroup % +} + +% @deftypemethod foo-class return-type foo-method args +% +\def\deftypemethod{% + \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} +% +% #1 is the class name, #2 the data type, #3 the method name, #4 the args. +\def\deftypemethodheader#1#2#3#4{% + \deftypefnheaderx{Method on #1}{#2}#3 #4\relax +} + +% @defmethod == @defop Method + +\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} + +\def\defmethodheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% entry in function index +\begingroup\defname {#2}{Method on #1}% +\defunargs {#3}\endgroup % +} + +% @defcv {Class Option} foo-class foo-flag + +\def\defcv #1 {\def\defcvtype{#1}% +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} + +\def\defcvarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{\defcvtype{} of #1}% +\defvarargs {#3}\endgroup % +} + +% @defivar == @defcv {Instance Variable} + +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} + +\def\defivarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{Instance Variable of #1}% +\defvarargs {#3}\endgroup % +} + +% These definitions are run if you use @defmethodx, etc., +% anywhere other than immediately after a @defmethod, etc. + +\def\defopx #1 {\errmessage{@defopx in invalid context}} +\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} +\def\defcvx #1 {\errmessage{@defcvx in invalid context}} +\def\defivarx #1 {\errmessage{@defivarx in invalid context}} + +% Now @defvar + +% First, define the processing that is wanted for arguments of @defvar. +% This is actually simple: just print them in roman. +% This must expand the args and terminate the paragraph they make up +\def\defvarargs #1{\normalparens #1% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000} + +% @defvr Counter foo-count + +\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} + +\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% +\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} + +% @defvar == @defvr Variable + +\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} + +\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{Variable}% +\defvarargs {#2}\endgroup % +} + +% @defopt == @defvr {User Option} + +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} + +\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{User Option}% +\defvarargs {#2}\endgroup % +} + +% @deftypevar int foobar + +\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} + +% #1 is the data type. #2 is the name, perhaps followed by text that +% is actually part of the data type, which should not be put into the index. +\def\deftypevarheader #1#2{% +\dovarind#2 \relax% Make entry in variables index +\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} +\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} + +% @deftypevr {Global Flag} int enable + +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} + +\def\deftypevrheader #1#2#3{\dovarind#3 \relax% +\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} + +% This definition is run if you use @defvarx +% anywhere other than immediately after a @defvar or @defvarx. + +\def\defvrx #1 {\errmessage{@defvrx in invalid context}} +\def\defvarx #1 {\errmessage{@defvarx in invalid context}} +\def\defoptx #1 {\errmessage{@defoptx in invalid context}} +\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} +\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} + +% Now define @deftp +% Args are printed in bold, a slight difference from @defvar. + +\def\deftpargs #1{\bf \defvarargs{#1}} + +% @deftp Class window height width ... + +\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} + +\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% +\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} + +% This definition is run if you use @deftpx, etc +% anywhere other than immediately after a @deftp, etc. + +\def\deftpx #1 {\errmessage{@deftpx in invalid context}} + + +\message{cross reference,} +% Define cross-reference macros +\newwrite \auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% \setref{foo} defines a cross-reference point named foo. + +\def\setref#1{% +\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ysectionnumberandtype}} + +\def\unnumbsetref#1{% +\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ynothing}} + +\def\appendixsetref#1{% +\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Yappendixletterandtype}} + +% \xref, \pxref, and \ref generate cross-references to specified points. +% For \xrefX, #1 is the node name, #2 the name of the Info +% cross-reference, #3 the printed node name, #4 the name of the Info +% file, #5 the name of the printed manual. All but the node name can be +% omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \def\printedmanual{\ignorespaces #5}% + \def\printednodename{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual}% + \setbox0=\hbox{\printednodename}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printednodename{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1>0pt% + % It is in another manual, so we don't have it. + \def\printednodename{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printednodename{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printednodename{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordsection{} ``\printednodename'' in \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive \refx{#1-snt}{}}% + \space [\printednodename],\space + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi +\endgroup} + +% \dosetq is the interface for calls from other macros + +% Use \turnoffactive so that punctuation chars such as underscore +% work in node names. +\def\dosetq #1#2{{\let\folio=0 \turnoffactive +\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% +\next}} + +% \internalsetq {foo}{page} expands into +% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} +% When the aux file is read, ' is the escape character + +\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} + +% Things to be expanded by \internalsetq + +\def\Ypagenumber{\folio} + +\def\Ytitle{\thissection} + +\def\Ynothing{} + +\def\Ysectionnumberandtype{% +\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % +\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % +\else % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\def\Yappendixletterandtype{% +\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% +\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % +\else % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\gdef\xreftie{'tie} + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Non-3.0. +\else + \def\linenumber{\the\inputlineno:\space} +\fi + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. + +\def\refx#1#2{% + \expandafter\ifx\csname X#1\endcsname\relax + % If not defined, say something at least. + $\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.}% + \fi + \fi + \else + % It's defined, so just use it. + \csname X#1\endcsname + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. +\def\xrdef #1#2{{% + \catcode`\'=\other + \expandafter\gdef\csname X#1\endcsname{#2}% +}} + +% Read the last existing aux file, if any. No error if none exists. +\def\readauxfile{\begingroup + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + \catcode`\@=\other + \catcode`\^=\other + % It was suggested to define this as 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + % `\+ does not work, so use 43. + \catcode43=\other + % Make the characters 128-255 be printing characters + {% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% + }% + % The aux file uses ' as the escape (for now). + % Turn off \ as an escape so we do not lose on + % entries which were dumped with control sequences in their names. + % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ + % Reference to such entries still does not work the way one would wish, + % but at least they do not bomb out when the aux file is read in. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\%=\other + \catcode`\'=0 + \catcode`\\=\other + % + \openin 1 \jobname.aux + \ifeof 1 \else + \closein 1 + \input \jobname.aux + \global\havexrefstrue + \global\warnedobstrue + \fi + % Open the new aux file. TeX will close it automatically at exit. + \openout\auxfile=\jobname.aux +\endgroup} + + +% Footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +\let\ptexfootnote=\footnote + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \footnotezzz +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset and anything else that uses +% \parseargline fail inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\long\gdef\footnotezzz{\insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + % Hang the footnote text off the number. + \hang + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t + \else\let\next\f@t\fi \next} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +\def\f@t#1{#1\@foot} +\def\@foot{\strut\egroup} + +}%end \catcode `\@=11 + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = xepsf.tex +\ifeof 1 \else + \closein 1 + \def\epsfannounce{\toks0 = }% do not bother showing banner + \input epsf.tex +\fi +% +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://ftp.tug.org/tex/epsf.tex.} +% +% Only complain once about lack of epsf.tex. +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is just the usual extra ignored arg for parsing this stuff. +\def\imagexxx#1,#2,#3,#4\finish{% + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% +} + +% End of control word definitions. + + +\message{and turning on texinfo input format.} + +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% Set some numeric style parameters, for 8.5 x 11 format. + +\hsize = 6in +\hoffset = .25in +\newdimen\defaultparindent \defaultparindent = 15pt +\parindent = \defaultparindent +\parskip 3pt plus 2pt minus 1pt +\setleading{13.2pt} +\advance\topskip by 1.2cm + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness=10000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. This makes it come to about 9pt for the 8.5x11 format. +% +\ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% +\else + \emergencystretch = \hsize + \divide\emergencystretch by 45 +\fi + +% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) +\def\smallbook{ + \global\chapheadingskip = 15pt plus 4pt minus 2pt + \global\secheadingskip = 12pt plus 3pt minus 2pt + \global\subsecheadingskip = 9pt plus 2pt minus 2pt + % + \global\lispnarrowing = 0.3in + \setleading{12pt} + \advance\topskip by -1cm + \global\parskip 2pt plus 1pt + \global\hsize = 5in + \global\vsize=7.5in + \global\tolerance=700 + \global\hfuzz=1pt + \global\contentsrightmargin=0pt + \global\deftypemargin=0pt + \global\defbodyindent=.5cm + % + \global\pagewidth=\hsize + \global\pageheight=\vsize + % + \global\let\smalllisp=\smalllispx + \global\let\smallexample=\smalllispx + \global\def\Esmallexample{\Esmalllisp} +} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{ +\global\tolerance=700 +\global\hfuzz=1pt +\setleading{12pt} +\global\parskip 15pt plus 1pt + +\global\vsize= 53\baselineskip +\advance\vsize by \topskip +%\global\hsize= 5.85in % A4 wide 10pt +\global\hsize= 6.5in +\global\outerhsize=\hsize +\global\advance\outerhsize by 0.5in +\global\outervsize=\vsize +\global\advance\outervsize by 0.6in + +\global\pagewidth=\hsize +\global\pageheight=\vsize +} + +\bindingoffset=0pt +\normaloffset=\hoffset +\pagewidth=\hsize +\pageheight=\vsize + +% Allow control of the text dimensions. Parameters in order: textheight; +% textwidth; voffset; hoffset; binding offset; topskip. +% All require a dimension; +% header is additional; added length extends the bottom of the page. + +\def\changepagesizes#1#2#3#4#5#6{ + \global\vsize= #1 + \global\topskip= #6 + \advance\vsize by \topskip + \global\voffset= #3 + \global\hsize= #2 + \global\outerhsize=\hsize + \global\advance\outerhsize by 0.5in + \global\outervsize=\vsize + \global\advance\outervsize by 0.6in + \global\pagewidth=\hsize + \global\pageheight=\vsize + \global\normaloffset= #4 + \global\bindingoffset= #5} + +% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin +% 29mm, hence bottom margin 28mm, nominal side margin 3cm. +\def\afourlatex + {\global\tolerance=700 + \global\hfuzz=1pt + \setleading{12pt} + \global\parskip 15pt plus 1pt + \advance\baselineskip by 1.6pt + \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm} + } + +% Use @afourwide to print on European A4 paper in wide format. +\def\afourwide{\afourpaper +\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} + +% This macro is used to make a character print one way in ttfont +% where it can probably just be output, and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt \char '042}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt \char '176}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} + +\catcode`\|=\active +\def|{{\tt \char '174}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +%\catcode 27=\active +%\def^^[{$\diamondsuit$} + +% Set up an active definition for =, but don't enable it most of the time. +{\catcode`\==\active +\global\def={{\tt \char 61}}} + +\catcode`+=\active +\catcode`\_=\active + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \rawbackslashxx output one backslash character in current font +\global\chardef\rawbackslashxx=`\\ +%{\catcode`\\=\other +%@gdef@rawbackslashxx{\}} + +% \rawbackslash redefines \ as input to do \rawbackslashxx. +{\catcode`\\=\active +@gdef@rawbackslash{@let\=@rawbackslashxx }} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\rawbackslashxx}} + +% Say @foo, not \foo, in error messages. +\escapechar=`\@ + +% \catcode 17=0 % Define control-q +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{@let"=@normaldoublequote +@let\=@realbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus} + +@def@normalturnoffactive{@let"=@normaldoublequote +@let\=@normalbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active @catcode`@_=@active} + +%% These look ok in all fonts, so just make them not special. The @rm below +%% makes sure that the current font starts out as the newly loaded cmr10 +@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other + +@textfonts +@rm + +@c Local variables: +@c page-delimiter: "^\\\\message" +@c End: diff --git a/gnu/usr.bin/texinfo/doc/texinfo.texi b/gnu/usr.bin/texinfo/doc/texinfo.texi new file mode 100644 index 00000000000..f0a4d2025b9 --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/texinfo.texi @@ -0,0 +1,17289 @@ +\input texinfo.tex @c -*-texinfo-*- +@c $Id: texinfo.texi,v 1.1 1997/08/01 22:01:11 kstailey Exp $ +@c %**start of header + +@c All text is ignored before the setfilename. +@setfilename texinfo +@settitle Texinfo @value{edition} + +@set edition 2.24 +@set update-month July 1997 +@set update-date 25 @value{update-month} + +@c Define a new index for options. +@defcodeindex op +@c Put everything except function (command, in this case) names in one +@c index (arbitrarily chosen to be the concept index). +@syncodeindex op cp +@syncodeindex vr cp +@syncodeindex pg cp + +@footnotestyle separate +@paragraphindent 2 +@finalout +@comment %**end of header + +@c Before release, run C-u C-c C-u C-a (texinfo-all-menus-update with a +@c prefix arg). This updates the node pointers, which texinfmt.el needs. + +@dircategory Texinfo documentation system +@direntry +* Texinfo: (texinfo). The GNU documentation format. +* install-info: (texinfo)Invoking install-info. Updating info/dir entries. +* texi2dvi: (texinfo)Format with texi2dvi. Printing Texinfo documentation. +* texindex: (texinfo)Format with tex/texindex. Sorting Texinfo index files. +* makeinfo: (texinfo)makeinfo Preferred. Translate Texinfo source. +@end direntry + +@c Set smallbook if printing in smallbook format so the example of the +@c smallbook font is actually written using smallbook; in bigbook, a kludge +@c is used for TeX output. Do this through the -t option to texi2dvi, +@c so this same source can be used for other paper sizes as well. +@c smallbook +@c set smallbook +@c @@clear smallbook + +@c Currently undocumented command, 5 December 1993: +@c +@c nwnode (Same as node, but no warnings; for `makeinfo'.) + +@ifinfo +This file documents Texinfo, a documentation system that can produce +both on-line information and a printed manual from a single source file. + +Copyright (C) 1988, 90, 91, 92, 93, 95, 96, 97 Free Software Foundation, Inc. + +This is the second edition of the Texinfo documentation,@* +and is consistent with version 2 of @file{texinfo.tex}. + +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. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +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. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Free Software Foundation. +@end ifinfo + +@setchapternewpage odd + +@shorttitlepage Texinfo + +@titlepage +@c use the new format for titles +@title Texinfo +@subtitle The GNU Documentation Format +@subtitle Edition @value{edition}, for Texinfo Version Three +@subtitle @value{update-month} + +@author Robert J.@: Chassell +@author Richard M.@: Stallman + +@c Include the Distribution inside the titlepage so +@c that headings are turned off. + +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1988, 90, 91, 92, 93, 95, 96, 97 +Free Software Foundation, Inc. + +@sp 2 +This is the second edition of the Texinfo documentation,@* +and is consistent with version 2 of @file{texinfo.tex}. +@sp 2 + +Published by the Free Software Foundation @* +59 Temple Place Suite 330 @* +Boston, MA 02111-1307 @* +USA @* +Printed copies are available for $15 each.@* +ISBN 1-882114-64-7 +@c ISBN 1-882114-63-9 is for edition 2.20 of 28 February 1995 +@c ISBN 1-882114-64-7 is for edition 2.23 of 1 October 1996. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Free Software Foundation. +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + +@ifinfo +@node Top, Copying, (dir), (dir) +@top Texinfo + +Texinfo is a documentation system that uses a single source file to +produce both on-line information and printed output.@refill + +The first part of this master menu lists the major nodes in this Info +document, including the @@-command and concept indices. The rest of +the menu lists all the lower level nodes in the document.@refill + +This is Edition @value{edition} of the Texinfo documentation, +@w{@value{update-date},} for Texinfo Version Three. +@end ifinfo + +@c Here is a spare copy of the chapter menu entry descriptions, +@c in case they are accidently deleted +@ignore +Your rights. +Texinfo in brief. +How to use Texinfo mode. +What is at the beginning of a Texinfo file? +What is at the end of a Texinfo file? +How to create chapters, sections, subsections, + appendices, and other parts. +How to provide structure for a document. +How to write nodes. +How to write menus. +How to write cross references. +How to mark words and phrases as code, + keyboard input, meta-syntactic + variables, and the like. +How to write quotations, examples, etc. +How to write lists and tables. +How to create indices. +How to insert @@-signs, braces, etc. +How to indicate results of evaluation, + expansion of macros, errors, etc. +How to force and prevent line and page breaks. +How to describe functions and the like in a uniform manner. +How to write footnotes. +How to specify text for either @TeX{} or Info. +How to print hardcopy. +How to create an Info file. +How to install an Info file +A list of all the Texinfo @@-commands. +Hints on how to write a Texinfo document. +A sample Texinfo file to look at. +Tell readers they have the right to copy + and distribute. +How to incorporate other Texinfo files. +How to write page headings and footings. +How to find formatting mistakes. +All about paragraph refilling. +A description of @@-Command syntax. +Texinfo second edition features. +A menu containing commands and variables. +A menu covering many topics. +@end ignore + +@menu +* Copying:: Your rights. +* Overview:: Texinfo in brief. +* Texinfo Mode:: How to use Texinfo mode. +* Beginning a File:: What is at the beginning of a Texinfo file? +* Ending a File:: What is at the end of a Texinfo file? +* Structuring:: How to create chapters, sections, subsections, + appendices, and other parts. +* Nodes:: How to write nodes. +* Menus:: How to write menus. +* Cross References:: How to write cross references. +* Marking Text:: How to mark words and phrases as code, + keyboard input, meta-syntactic + variables, and the like. +* Quotations and Examples:: How to write quotations, examples, etc. +* Lists and Tables:: How to write lists and tables. +* Indices:: How to create indices. +* Insertions:: How to insert @@-signs, braces, etc. +* Breaks:: How to force and prevent line and page breaks. +* Definition Commands:: How to describe functions and the like + in a uniform manner. +* Footnotes:: How to write footnotes. +* Conditionals:: How to specify text for either @TeX{} or Info. +* Macros:: Defining new Texinfo commands. +* Format/Print Hardcopy:: How to convert a Texinfo file to a file + for printing and how to print that file. +* Create an Info File:: Convert a Texinfo file into an Info file. +* Install an Info File:: Make an Info file accessible to users. +* Command List:: All the Texinfo @@-commands. +* Tips:: Hints on how to write a Texinfo document. +* Sample Texinfo File:: A sample Texinfo file to look at. +* Sample Permissions:: Tell readers they have the right to copy + and distribute. +* Include Files:: How to incorporate other Texinfo files. +* Headings:: How to write page headings and footings. +* Catching Mistakes:: How to find formatting mistakes. +* Refilling Paragraphs:: All about paragraph refilling. +* Command Syntax:: A description of @@-Command syntax. +* Obtaining TeX:: How to Obtain @TeX{}. +* Command and Variable Index:: A menu containing commands and variables. +* Concept Index:: A menu covering many topics. + +@detailmenu + + --- The Detailed Node Listing --- + +Overview of Texinfo + +* Using Texinfo:: Create a conventional printed book + or an Info file. +* Info Files:: What is an Info file? +* Printed Books:: Characteristics of a printed book or manual. +* Formatting Commands:: @@-commands are used for formatting. +* Conventions:: General rules for writing a Texinfo file. +* Comments:: How to write comments and mark regions that + the formatting commands will ignore. +* Minimum:: What a Texinfo file must have. +* Six Parts:: Usually, a Texinfo file has six parts. +* Short Sample:: A short sample Texinfo file. +* Acknowledgements:: + +Using Texinfo Mode + +* Texinfo Mode Overview:: How Texinfo mode can help you. +* Emacs Editing:: Texinfo mode adds to GNU Emacs' general + purpose editing features. +* Inserting:: How to insert frequently used @@-commands. +* Showing the Structure:: How to show the structure of a file. +* Updating Nodes and Menus:: How to update or create new nodes and menus. +* Info Formatting:: How to format for Info. +* Printing:: How to format and print part or all of a file. +* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. + +Updating Nodes and Menus + +* Updating Commands:: Five major updating commands. +* Updating Requirements:: How to structure a Texinfo file for + using the updating command. +* Other Updating Commands:: How to indent descriptions, insert + missing nodes lines, and update + nodes in sequence. + +Beginning a Texinfo File + +* Four Parts:: Four parts begin a Texinfo file. +* Sample Beginning:: Here is a sample beginning for a Texinfo file. +* Header:: The very beginning of a Texinfo file. +* Info Summary and Permissions:: Summary and copying permissions for Info. +* Titlepage & Copyright Page:: Creating the title and copyright pages. +* The Top Node:: Creating the `Top' node and master menu. +* Software Copying Permissions:: Ensure that you and others continue to + have the right to use and share software. + +The Texinfo File Header + +* First Line:: The first line of a Texinfo file. +* Start of Header:: Formatting a region requires this. +* setfilename:: Tell Info the name of the Info file. +* settitle:: Create a title for the printed work. +* setchapternewpage:: Start chapters on right-hand pages. +* paragraphindent:: An option to specify paragraph indentation. +* End of Header:: Formatting a region requires this. + +The Title and Copyright Pages + +* titlepage:: Create a title for the printed document. +* titlefont center sp:: The @code{@@titlefont}, @code{@@center}, + and @code{@@sp} commands. +* title subtitle author:: The @code{@@title}, @code{@@subtitle}, + and @code{@@author} commands. +* Copyright & Permissions:: How to write the copyright notice and + include copying permissions. +* end titlepage:: Turn on page headings after the title and + copyright pages. +* headings on off:: An option for turning headings on and off + and double or single sided printing. + +The `Top' Node and Master Menu + +* Title of Top Node:: Sketch what the file is about. +* Master Menu Parts:: A master menu has three or more parts. + +Ending a Texinfo File + +* Printing Indices & Menus:: How to print an index in hardcopy and + generate index menus in Info. +* Contents:: How to create a table of contents. +* File End:: How to mark the end of a file. + +Chapter Structuring + +* Tree Structuring:: A manual is like an upside down tree @dots{} +* Structuring Command Types:: How to divide a manual into parts. +* makeinfo top:: The @code{@@top} command, part of the `Top' node. +* chapter:: +* unnumbered & appendix:: +* majorheading & chapheading:: +* section:: +* unnumberedsec appendixsec heading:: +* subsection:: +* unnumberedsubsec appendixsubsec subheading:: +* subsubsection:: Commands for the lowest level sections. +* Raise/lower sections:: How to change commands' hierarchical level. + +Nodes + +* Two Paths:: Different commands to structure + Info output and printed output. +* Node Menu Illustration:: A diagram, and sample nodes and menus. +* node:: How to write a node, in detail. +* makeinfo Pointer Creation:: How to create node pointers with @code{makeinfo}. + +The @code{@@node} Command + +* Node Names:: How to choose node and pointer names. +* Writing a Node:: How to write an @code{@@node} line. +* Node Line Tips:: Keep names short. +* Node Line Requirements:: Keep names unique, without @@-commands. +* First Node:: How to write a `Top' node. +* makeinfo top command:: How to use the @code{@@top} command. +* Top Node Summary:: Write a brief description for readers. + +Menus + +* Menu Location:: Put a menu in a short node. +* Writing a Menu:: What is a menu? +* Menu Parts:: A menu entry has three parts. +* Less Cluttered Menu Entry:: Two part menu entry. +* Menu Example:: Two and three part menu entries. +* Other Info Files:: How to refer to a different Info file. + +Cross References + +* References:: What cross references are for. +* Cross Reference Commands:: A summary of the different commands. +* Cross Reference Parts:: A cross reference has several parts. +* xref:: Begin a reference with `See' @dots{} +* Top Node Naming:: How to refer to the beginning of another file. +* ref:: A reference for the last part of a sentence. +* pxref:: How to write a parenthetical cross reference. +* inforef:: How to refer to an Info-only file. +* uref:: How to refer to a uniform resource locator. + +@code{@@xref} + +* Reference Syntax:: What a reference looks like and requires. +* One Argument:: @code{@@xref} with one argument. +* Two Arguments:: @code{@@xref} with two arguments. +* Three Arguments:: @code{@@xref} with three arguments. +* Four and Five Arguments:: @code{@@xref} with four and five arguments. + +Marking Words and Phrases + +* Indicating:: How to indicate definitions, files, etc. +* Emphasis:: How to emphasize text. + +Indicating Definitions, Commands, etc. + +* Useful Highlighting:: Highlighting provides useful information. +* code:: How to indicate code. +* kbd:: How to show keyboard input. +* key:: How to specify keys. +* samp:: How to show a literal sequence of characters. +* var:: How to indicate a metasyntactic variable. +* file:: How to indicate the name of a file. +* dfn:: How to specify a definition. +* cite:: How to refer to a book that is not in Info. +* url:: How to indicate a world wide web reference. +* email:: How to indicate an electronic mail address. + +Emphasizing Text + +* emph & strong:: How to emphasize text in Texinfo. +* Smallcaps:: How to use the small caps font. +* Fonts:: Various font commands for printed output. +* Customized Highlighting:: How to define highlighting commands. + +Quotations and Examples + +* Block Enclosing Commands:: Use different constructs for + different purposes. +* quotation:: How to write a quotation. +* example:: How to write an example in a fixed-width font. +* noindent:: How to prevent paragraph indentation. +* Lisp Example:: How to illustrate Lisp code. +* smallexample & smalllisp:: Forms for the @code{@@smallbook} option. +* display:: How to write an example in the current font. +* format:: How to write an example that does not narrow + the margins. +* exdent:: How to undo the indentation of a line. +* flushleft & flushright:: How to push text flushleft or flushright. +* cartouche:: How to draw cartouches around examples. + +Lists and Tables + +* Introducing Lists:: Texinfo formats lists for you. +* itemize:: How to construct a simple list. +* enumerate:: How to construct a numbered list. +* Two-column Tables:: How to construct a two-column table. +* Multi-column Tables:: How to construct generalized tables. + +Making a Two-column Table + +* table:: How to construct a two-column table. +* ftable vtable:: Automatic indexing for two-column tables. +* itemx:: How to put more entries in the first column. + +Multi-column Tables + +* Multitable Column Widths:: Defining multitable column widths. +* Multitable Rows:: Defining multitable rows, with examples. + +Creating Indices + +* Index Entries:: Choose different words for index entries. +* Predefined Indices:: Use different indices for different kinds + of entry. +* Indexing Commands:: How to make an index entry. +* Combining Indices:: How to combine indices. +* New Indices:: How to define your own indices. + +Combining Indices + +* syncodeindex:: How to merge two indices, using @code{@@code} + font for the merged-from index. +* synindex:: How to merge two indices, using the + default font of the merged-to index. + +Special Insertions + +* Braces Atsigns:: How to insert braces, @samp{@@}. +* Inserting Space:: How to insert the right amount of space + within a sentence. +* Inserting Accents:: How to insert accents and special characters. +* Dots Bullets:: How to insert dots and bullets. +* TeX and copyright:: How to insert the @TeX{} logo + and the copyright symbol. +* pounds:: How to insert the pounds currency symbol. +* minus:: How to insert a minus sign. +* math:: How to format a mathematical expression. +* Glyphs:: How to indicate results of evaluation, + expansion of macros, errors, etc. +* Images:: How to include graphics. + +Inserting @@ and Braces + +* Inserting An Atsign:: How to insert @samp{@@}. +* Inserting Braces:: How to insert @samp{@{} and @samp{@}}. + +Inserting Space + +* Not Ending a Sentence:: Sometimes a . doesn't end a sentence. +* Ending a Sentence:: Sometimes it does. +* Multiple Spaces:: Inserting multiple spaces. +* dmn:: How to format a dimension. + +Inserting Ellipsis, Dots, and Bullets + +* dots:: How to insert dots @dots{} +* bullet:: How to insert a bullet. + +Inserting @TeX{} and the Copyright Symbol + +* tex:: How to insert the @TeX{} logo. +* copyright symbol:: How to use @code{@@copyright}@{@}. + +Glyphs for Examples + +* Glyphs Summary:: +* result:: How to show the result of expression. +* expansion:: How to indicate an expansion. +* Print Glyph:: How to indicate printed output. +* Error Glyph:: How to indicate an error message. +* Equivalence:: How to indicate equivalence. +* Point Glyph:: How to indicate the location of point. + +Glyphs Summary + +* result:: +* expansion:: +* Print Glyph:: +* Error Glyph:: +* Equivalence:: +* Point Glyph:: + +Making and Preventing Breaks + +* Break Commands:: Cause and prevent splits. +* Line Breaks:: How to force a single line to use two lines. +* - and hyphenation:: How to tell TeX about hyphenation points. +* w:: How to prevent unwanted line breaks. +* sp:: How to insert blank lines. +* page:: How to force the start of a new page. +* group:: How to prevent unwanted page breaks. +* need:: Another way to prevent unwanted page breaks. + +Definition Commands + +* Def Cmd Template:: How to structure a description using a + definition command. +* Optional Arguments:: How to handle optional and repeated arguments. +* deffnx:: How to group two or more `first' lines. +* Def Cmds in Detail:: All the definition commands. +* Def Cmd Conventions:: Conventions for writing definitions. +* Sample Function Definition:: + +The Definition Commands + +* Functions Commands:: Commands for functions and similar entities. +* Variables Commands:: Commands for variables and similar entities. +* Typed Functions:: Commands for functions in typed languages. +* Typed Variables:: Commands for variables in typed languages. +* Abstract Objects:: Commands for object-oriented programming. +* Data Types:: The definition command for data types. + +Footnotes + +* Footnote Commands:: How to write a footnote in Texinfo. +* Footnote Styles:: Controlling how footnotes appear in Info. + +Conditionally Visible Text + +* Conditional Commands:: Specifying text for HTML, Info, or @TeX{}. +* Conditional Not Commands:: Specifying text for not HTML, Info, or @TeX{}. +* Raw Formatter Commands:: Using raw @TeX{} or HTML commands. +* set clear value:: Designating which text to format (for + all output formats); and how to set a + flag to a string that you can insert. + +@code{@@set}, @code{@@clear}, and @code{@@value} + +* ifset ifclear:: Format a region if a flag is set. +* value:: Replace a flag with a string. +* value Example:: An easy way to update edition information. + +Macros: Defining New Texinfo Commands + +* Defining Macros:: Both defining and undefining new commands. +* Invoking Macros:: Using a macro, once you've defined it. + +Format and Print Hardcopy + +* Use TeX:: Use @TeX{} to format for hardcopy. +* Format with tex/texindex:: How to format in a shell. +* Format with texi2dvi:: A simpler way to use the shell. +* Print with lpr:: How to print. +* Within Emacs:: How to format and print from an Emacs shell. +* Texinfo Mode Printing:: How to format and print in Texinfo mode. +* Compile-Command:: How to print using Emacs's compile command. +* Requirements Summary:: @TeX{} formatting requirements summary. +* Preparing for TeX:: What you need to do to use @TeX{}. +* Overfull hboxes:: What are and what to do with overfull hboxes. +* smallbook:: How to print small format books and manuals. +* A4 Paper:: How to print on European A4 paper. +* Cropmarks and Magnification:: How to print marks to indicate the size + of pages and how to print scaled up output. + +Creating an Info File + +* makeinfo advantages:: @code{makeinfo} provides better error checking. +* Invoking makeinfo:: How to run @code{makeinfo} from a shell. +* makeinfo options:: Specify fill-column and other options. +* Pointer Validation:: How to check that pointers point somewhere. +* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs. +* texinfo-format commands:: Two Info formatting commands written + in Emacs Lisp are an alternative + to @code{makeinfo}. +* Batch Formatting:: How to format for Info in Emacs Batch mode. +* Tag and Split Files:: How tagged and split files help Info + to run better. + +Installing an Info File + +* Directory file:: The top level menu for all Info files. +* New Info File:: Listing a new info file. +* Other Info Directories:: How to specify Info files that are + located in other directories. +* Installing Dir Entries:: How to specify what menu entry to add + to the Info directory. +* Invoking install-info:: @code{install-info} options. + +Sample Permissions + +* Inserting Permissions:: How to put permissions in your document. +* ifinfo Permissions:: Sample @samp{ifinfo} copying permissions. +* Titlepage Permissions:: Sample Titlepage copying permissions. + +Include Files + +* Using Include Files:: How to use the @code{@@include} command. +* texinfo-multiple-files-update:: How to create and update nodes and + menus when using included files. +* Include File Requirements:: What @code{texinfo-multiple-files-update} expects. +* Sample Include File:: A sample outer file with included files + within it; and a sample included file. +* Include Files Evolution:: How use of the @code{@@include} command + has changed over time. + +Page Headings + +* Headings Introduced:: Conventions for using page headings. +* Heading Format:: Standard page heading formats. +* Heading Choice:: How to specify the type of page heading. +* Custom Headings:: How to create your own headings and footings. + +Formatting Mistakes + +* makeinfo Preferred:: @code{makeinfo} finds errors. +* Debugging with Info:: How to catch errors with Info formatting. +* Debugging with TeX:: How to catch errors with @TeX{} formatting. +* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}. +* Using occur:: How to list all lines containing a pattern. +* Running Info-Validate:: How to find badly referenced nodes. + +Finding Badly Referenced Nodes + +* Using Info-validate:: How to run @code{Info-validate}. +* Unsplit:: How to create an unsplit file. +* Tagifying:: How to tagify a file. +* Splitting:: How to split a file manually. + +How to Obtain @TeX{} + +* New Texinfo Mode Commands:: The updating commands are especially useful. +* New Commands:: Many newly described @@-commands. +@end detailmenu +@end menu + +@node Copying, Overview, Top, Top +@comment node-name, next, previous, up +@unnumbered Texinfo Copying Conditions +@cindex Copying conditions +@cindex Conditions for copying Texinfo + +The programs currently being distributed that relate to Texinfo include +portions of GNU Emacs, plus other separate programs (including +@code{makeinfo}, @code{info}, @code{texindex}, and @file{texinfo.tex}). +These programs are @dfn{free}; this means that everyone is free to use +them and free to redistribute them on a free basis. The Texinfo-related +programs are not in the public domain; they are copyrighted and there +are restrictions on their distribution, but these restrictions are +designed to permit everything that a good cooperating citizen would want +to do. What is not allowed is to try to prevent others from further +sharing any version of these programs that they might get from +you.@refill + + Specifically, we want to make sure that you have the right to give +away copies of the programs that relate to Texinfo, that you receive +source code or else can get it if you want it, that you can change these +programs or use pieces of them in new free programs, and that you know +you can do these things.@refill + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute +copies of the Texinfo related programs, you must give the recipients all +the rights that you have. You must make sure that they, too, receive or +can get the source code. And you must tell them their rights.@refill + + Also, for our own protection, we must make certain that everyone finds +out that there is no warranty for the programs that relate to Texinfo. +If these programs are modified by someone else and passed on, we want +their recipients to know that what they have is not what we distributed, +so that any problems introduced by others will not reflect on our +reputation.@refill + + The precise conditions of the licenses for the programs currently +being distributed that relate to Texinfo are found in the General Public +Licenses that accompany them.@refill + +@node Overview, Texinfo Mode, Copying, Top +@comment node-name, next, previous, up +@chapter Overview of Texinfo +@cindex Overview of Texinfo +@cindex Texinfo overview + +@dfn{Texinfo}@footnote{Note that the first syllable of ``Texinfo'' is +pronounced like ``speck'', not ``hex''. This odd pronunciation is +derived from, but is not the same as, the pronunciation of @TeX{}. In +the word @TeX{}, the @samp{X} is actually the Greek letter ``chi'' +rather than the English letter ``ex''. Pronounce @TeX{} as if the +@samp{X} were the last sound in the name `Bach'; but pronounce Texinfo +as if the @samp{x} were a `k'. Spell ``Texinfo'' with a capital ``T'' +and write the other letters in lower case.} +is a documentation system that uses a single source file to produce both +on-line information and printed output. This means that instead of +writing two different documents, one for the on-line help or other on-line +information and the other for a typeset manual or other printed work, you +need write only one document. When the work is revised, you need revise +only one document. (You can read the on-line information, known as an +@dfn{Info file}, with an Info documentation-reading program.)@refill + +@menu +* Using Texinfo:: Create a conventional printed book + or an Info file. +* Info Files:: What is an Info file? +* Printed Books:: Characteristics of a printed book or manual. +* Formatting Commands:: @@-commands are used for formatting. +* Conventions:: General rules for writing a Texinfo file. +* Comments:: How to write comments and mark regions that + the formatting commands will ignore. +* Minimum:: What a Texinfo file must have. +* Six Parts:: Usually, a Texinfo file has six parts. +* Short Sample:: A short sample Texinfo file. +* Acknowledgements:: +@end menu + +@node Using Texinfo, Info Files, Overview, Overview +@ifinfo +@heading Using Texinfo +@end ifinfo + +Using Texinfo, you can create a printed document with the normal +features of a book, including chapters, sections, cross references, +and indices. From the same Texinfo source file, you can create a +menu-driven, on-line Info file with nodes, menus, cross references, +and indices. You can, if you wish, make the chapters and sections of +the printed document correspond to the nodes of the on-line +information; and you use the same cross references and indices for +both the Info file and the printed work. @cite{The GNU +Emacs Manual} is a good example of a Texinfo file, as is this manual.@refill + +To make a printed document, you process a Texinfo source file with the +@TeX{} typesetting program. This creates a DVI file that you can +typeset and print as a book or report. (Note that the Texinfo language +is completely different from @TeX{}'s usual language, plain @TeX{}.) If +you do not have @TeX{}, but do have @code{troff} or @code{nroff}, you +can use the @code{texi2roff} program instead.@refill + +To make an Info file, you process a Texinfo source file with the +@code{makeinfo} utility or Emacs's @code{texinfo-format-buffer} command; +this creates an Info file that you can install on-line.@refill + +@TeX{} and @code{texi2roff} work with many types of printers; similarly, +Info works with almost every type of computer terminal. This power +makes Texinfo a general purpose system, but brings with it a constraint, +which is that a Texinfo file may contain only the customary +``typewriter'' characters (letters, numbers, spaces, and punctuation +marks) but no special graphics.@refill + +A Texinfo file is a plain @sc{ascii} file containing text and +@dfn{@@-commands} (words preceded by an @samp{@@}) that tell the +typesetting and formatting programs what to do. You may edit a +Texinfo file with any text editor; but it is especially convenient to +use GNU Emacs since that editor has a special mode, called Texinfo +mode, that provides various Texinfo-related features. (@xref{Texinfo +Mode}.)@refill + +Before writing a Texinfo source file, you should become familiar with +the Info documentation reading program and learn about nodes, +menus, cross references, and the rest. (@inforef{Top, info, info}, +for more information.)@refill + +You can use Texinfo to create both on-line help and printed manuals; +moreover, Texinfo is freely redistributable. For these reasons, Texinfo +is the format in which documentation for GNU utilities and libraries is +written.@refill + +@node Info Files, Printed Books, Using Texinfo, Overview +@comment node-name, next, previous, up +@section Info files +@cindex Info files + +An Info file is a Texinfo file formatted so that the Info documentation +reading program can operate on it. (@code{makeinfo} +and @code{texinfo-format-buffer} are two commands that convert a Texinfo file +into an Info file.)@refill + +Info files are divided into pieces called @dfn{nodes}, each of which +contains the discussion of one topic. Each node has a name, and +contains both text for the user to read and pointers to other nodes, +which are identified by their names. The Info program displays one node +at a time, and provides commands with which the user can move to other +related nodes.@refill + +@ifinfo +@inforef{Top, info, info}, for more information about using Info.@refill +@end ifinfo + +Each node of an Info file may have any number of child nodes that +describe subtopics of the node's topic. The names of child +nodes are listed in a @dfn{menu} within the parent node; this +allows you to use certain Info commands to move to one of the child +nodes. Generally, an Info file is organized like a book. If a node +is at the logical level of a chapter, its child nodes are at the level +of sections; likewise, the child nodes of sections are at the level +of subsections.@refill + +All the children of any one parent are linked together in a +bidirectional chain of `Next' and `Previous' pointers. The `Next' +pointer provides a link to the next section, and the `Previous' pointer +provides a link to the previous section. This means that all the nodes +that are at the level of sections within a chapter are linked together. +Normally the order in this chain is the same as the order of the +children in the parent's menu. Each child node records the parent node +name as its `Up' pointer. The last child has no `Next' pointer, and the +first child has the parent both as its `Previous' and as its `Up' +pointer.@footnote{In some documents, the first child has no `Previous' +pointer. Occasionally, the last child has the node name of the next +following higher level node as its `Next' pointer.}@refill + +The book-like structuring of an Info file into nodes that correspond +to chapters, sections, and the like is a matter of convention, not a +requirement. The `Up', `Previous', and `Next' pointers of a node can +point to any other nodes, and a menu can contain any other nodes. +Thus, the node structure can be any directed graph. But it is usually +more comprehensible to follow a structure that corresponds to the +structure of chapters and sections in a printed book or report.@refill + +In addition to menus and to `Next', `Previous', and `Up' pointers, Info +provides pointers of another kind, called references, that can be +sprinkled throughout the text. This is usually the best way to +represent links that do not fit a hierarchical structure.@refill + +Usually, you will design a document so that its nodes match the +structure of chapters and sections in the printed output. But +occasionally there are times when this is not right for the material +being discussed. Therefore, Texinfo uses separate commands to specify +the node structure for the Info file and the section structure for the +printed output.@refill + +Generally, you enter an Info file through a node that by convention is +named `Top'. This node normally contains just a brief summary of the +file's purpose, and a large menu through which the rest of the file is +reached. From this node, you can either traverse the file +systematically by going from node to node, or you can go to a specific +node listed in the main menu, or you can search the index menus and then +go directly to the node that has the information you want. Alternatively, +with the standalone Info program, you can specify specific menu items on +the command line (@pxref{Top,,, info, Info}). + +If you want to read through an Info file in sequence, as if it were a +printed manual, you can hit @key{SPC} repeatedly, or you get the whole +file with the advanced Info command @kbd{g *}. (@inforef{Expert, +Advanced Info commands, info}.)@refill + +@c !!! dir file may be located in one of many places: +@c /usr/local/emacs/info mentioned in info.c DEFAULT_INFOPATH +@c /usr/local/lib/emacs/info mentioned in info.c DEFAULT_INFOPATH +@c /usr/gnu/info mentioned in info.c DEFAULT_INFOPATH +@c /usr/local/info +@c /usr/local/lib/info +The @file{dir} file in the @file{info} directory serves as the +departure point for the whole Info system. From it, you can reach the +`Top' nodes of each of the documents in a complete Info system.@refill + +@node Printed Books, Formatting Commands, Info Files, Overview +@comment node-name, next, previous, up +@section Printed Books +@cindex Printed book and manual characteristics +@cindex Manual characteristics, printed +@cindex Book characteristics, printed +@cindex Texinfo printed book characteristics +@cindex Characteristics, printed books or manuals + +@cindex Knuth, Donald +A Texinfo file can be formatted and typeset as a printed book or manual. +To do this, you need @TeX{}, a powerful, sophisticated typesetting +program written by Donald Knuth.@footnote{You can also use the +@code{texi2roff} program if you do not have @TeX{}; since Texinfo is +designed for use with @TeX{}, @code{texi2roff} is not described here. +@code{texi2roff} is not part of the standard GNU distribution.} + +A Texinfo-based book is similar to any other typeset, printed work: it +can have a title page, copyright page, table of contents, and preface, +as well as chapters, numbered or unnumbered sections and subsections, +page headers, cross references, footnotes, and indices.@refill + +You can use Texinfo to write a book without ever having the intention +of converting it into on-line information. You can use Texinfo for +writing a printed novel, and even to write a printed memo, although +this latter application is not recommended since electronic mail is so +much easier.@refill + +@TeX{} is a general purpose typesetting program. Texinfo provides a +file called @file{texinfo.tex} that contains information (definitions or +@dfn{macros}) that @TeX{} uses when it typesets a Texinfo file. +(@file{texinfo.tex} tells @TeX{} how to convert the Texinfo @@-commands +to @TeX{} commands, which @TeX{} can then process to create the typeset +document.) @file{texinfo.tex} contains the specifications for printing +a document.@refill + +Most often, documents are printed on 8.5 inch by 11 inch +pages (216@dmn{mm} by 280@dmn{mm}; this is the default size), but you +can also print for 7 inch by 9.25 inch pages (178@dmn{mm} by +235@dmn{mm}; the @code{@@smallbook} size) or on European A4 size paper +(@code{@@afourpaper}). (@xref{smallbook, , Printing ``Small'' Books}. +Also, see @ref{A4 Paper, ,Printing on A4 Paper}.)@refill + +By changing the parameters in @file{texinfo.tex}, you can change the +size of the printed document. In addition, you can change the style in +which the printed document is formatted; for example, you can change the +sizes and fonts used, the amount of indentation for each paragraph, the +degree to which words are hyphenated, and the like. By changing the +specifications, you can make a book look dignified, old and serious, or +light-hearted, young and cheery.@refill + +@TeX{} is freely distributable. It is written in a superset of Pascal +called WEB and can be compiled either in Pascal or (by using a +conversion program that comes with the @TeX{} distribution) in C. +(@xref{TeX Mode, ,@TeX{} Mode, emacs, The GNU Emacs Manual}, for information +about @TeX{}.)@refill + +@TeX{} is very powerful and has a great many features. Because a +Texinfo file must be able to present information both on a +character-only terminal in Info form and in a typeset book, the +formatting commands that Texinfo supports are necessarily +limited.@refill + +@xref{Obtaining TeX, , How to Obtain @TeX{}}. + + +@node Formatting Commands, Conventions, Printed Books, Overview +@comment node-name, next, previous, up +@section @@-commands +@cindex @@-commands +@cindex Formatting commands + +In a Texinfo file, the commands that tell @TeX{} how to typeset the +printed manual and tell @code{makeinfo} and +@code{texinfo-format-buffer} how to create an Info file are preceded +by @samp{@@}; they are called @dfn{@@-commands}. For example, +@code{@@node} is the command to indicate a node and @code{@@chapter} +is the command to indicate the start of a chapter.@refill + +@quotation +@strong{Please note:} All the @@-commands, with the exception of the +@code{@@TeX@{@}} command, must be written entirely in lower +case.@refill +@end quotation + +The Texinfo @@-commands are a strictly limited set of constructs. The +strict limits make it possible for Texinfo files to be understood both +by @TeX{} and by the code that converts them into Info files. You can +display Info files on any terminal that displays alphabetic and +numeric characters. Similarly, you can print the output generated by +@TeX{} on a wide variety of printers.@refill + +Depending on what they do or what arguments@footnote{The word +@dfn{argument} comes from the way it is used in mathematics and does +not refer to a disputation between two people; it refers to the +information presented to the command. According to the @cite{Oxford +English Dictionary}, the word derives from the Latin for @dfn{to make +clear, prove}; thus it came to mean `the evidence offered as proof', +which is to say, `the information offered', which led to its +mathematical meaning. In its other thread of derivation, the word +came to mean `to assert in a manner against which others may make +counter assertions', which led to the meaning of `argument' as a +disputation.} they take, you need to write @@-commands on lines of +their own or as part of sentences:@refill + +@itemize @bullet +@item +Write a command such as @code{@@noindent} at the beginning of a line as +the only text on the line. (@code{@@noindent} prevents the beginning of +the next line from being indented as the beginning of a +paragraph.)@refill + +@item +Write a command such as @code{@@chapter} at the beginning of a line +followed by the command's arguments, in this case the chapter title, on +the rest of the line. (@code{@@chapter} creates chapter titles.)@refill + +@item +Write a command such as @code{@@dots@{@}} wherever you wish but usually +within a sentence. (@code{@@dots@{@}} creates dots @dots{})@refill + +@item +Write a command such as @code{@@code@{@var{sample-code}@}} wherever you +wish (but usually within a sentence) with its argument, +@var{sample-code} in this example, between the braces. (@code{@@code} +marks text as being code.)@refill + +@item +Write a command such as @code{@@example} at the beginning of a line of +its own; write the body-text on following lines; and write the matching +@code{@@end} command, @code{@@end example} in this case, at the +beginning of a line of its own after the body-text. (@code{@@example} +@dots{} @code{@@end example} indents and typesets body-text as an +example.)@refill +@end itemize + +@noindent +@cindex Braces, when to use +As a general rule, a command requires braces if it mingles among other +text; but it does not need braces if it starts a line of its own. The +non-alphabetic commands, such as @code{@@:}, are exceptions to the rule; +they do not need braces.@refill + +As you gain experience with Texinfo, you will rapidly learn how to +write the different commands: the different ways to write commands +make it easier to write and read Texinfo files than if all commands +followed exactly the same syntax. (For details about @@-command +syntax, see @ref{Command Syntax, , @@-Command Syntax}.)@refill + +@node Conventions, Comments, Formatting Commands, Overview +@comment node-name, next, previous, up +@section General Syntactic Conventions +@cindex General syntactic conventions +@cindex Syntactic conventions +@cindex Conventions, syntactic + +All printable @sc{ascii} characters except @samp{@@}, @samp{@{} and +@samp{@}} can appear in a Texinfo file and stand for themselves. +@samp{@@} is the escape character which introduces commands. +@samp{@{} and @samp{@}} should be used only to surround arguments to +certain commands. To put one of these special characters into the +document, put an @samp{@@} character in front of it, like this: +@samp{@@@@}, @samp{@@@{}, and @samp{@@@}}.@refill + +@ifinfo +It is customary in @TeX{} to use doubled single-quote characters to +begin and end quotations: ` ` and ' ' (but without a space between the +two single-quote characters). This convention should be followed in +Texinfo files. @TeX{} converts doubled single-quote characters to +left- and right-hand doubled quotation marks and Info converts doubled +single-quote characters to @sc{ascii} double-quotes: ` ` and ' ' to " .@refill +@end ifinfo +@iftex +It is customary in @TeX{} to use doubled single-quote characters to +begin and end quotations: @w{@tt{ `` }} and @w{@tt{ '' }}. This +convention should be followed in Texinfo files. @TeX{} converts +doubled single-quote characters to left- and right-hand doubled +quotation marks, ``like this'', and Info converts doubled single-quote +characters to @sc{ascii} double-quotes: @w{@tt{ `` }} and +@w{@tt{ '' }} to @w{@tt{ " }}.@refill +@end iftex + +Use three hyphens in a row, @samp{---}, for a dash---like this. In +@TeX{}, a single or double hyphen produces a printed dash that is +shorter than the usual typeset dash. Info reduces three hyphens to two +for display on the screen. + +To prevent a paragraph from being indented in the printed manual, put +the command @code{@@noindent} on a line by itself before the +paragraph.@refill + +If you mark off a region of the Texinfo file with the @code{@@iftex} +and @w{@code{@@end iftex}} commands, that region will appear only in +the printed copy; in that region, you can use certain commands +borrowed from plain @TeX{} that you cannot use in Info. Likewise, if +you mark off a region with the @code{@@ifinfo} and @code{@@end ifinfo} +commands, that region will appear only in the Info file; in that +region, you can use Info commands that you cannot use in @TeX{}. +Similarly for @code{@@ifhtml @dots{} @@end ifhtml}, +@code{@@ifnothtml @dots{} @@end ifnothtml}, +@code{@@ifnotinfo @dots{} @@end ifnotinfo}, +@code{@@ifnottex @dots{} @@end ifnottex}, +@xref{Conditionals}. + +@cindex Tabs; don't use! +@quotation +@strong{Caution:} Do not use tabs in a Texinfo file! @TeX{} uses +variable-width fonts, which means that it cannot predefine a tab to work +in all circumstances. Consequently, @TeX{} treats tabs like single +spaces, and that is not what they look like. Furthermore, +@code{makeinfo} does nothing special with tabs, and thus a tab character +in your input file may appear differently in the output. + +@noindent +To avoid this problem, Texinfo mode causes GNU Emacs to insert multiple +spaces when you press the @key{TAB} key.@refill + +@noindent +Also, you can run @code{untabify} in Emacs to convert tabs in a region +to multiple spaces.@refill + +@noindent +Don't use tabs. +@end quotation + +@node Comments, Minimum, Conventions, Overview +@comment node-name, next, previous, up +@section Comments + +You can write comments in a Texinfo file that will not appear in +either the Info file or the printed manual by using the +@code{@@comment} command (which may be abbreviated to @code{@@c}). +Such comments are for the person who reads the Texinfo file. All the +text on a line that follows either @code{@@comment} or @code{@@c} is a +comment; the rest of the line does not appear in either the Info file +or the printed manual. (Often, you can write the @code{@@comment} or +@code{@@c} in the middle of a line, and only the text that follows after +the @code{@@comment} or @code{@@c} command does not appear; but some +commands, such as @code{@@settitle} and @code{@@setfilename}, work on a +whole line. You cannot use @code{@@comment} or @code{@@c} in a line +beginning with such a command.)@refill +@cindex Comments +@findex comment +@findex c @r{(comment)} + +You can write long stretches of text that will not appear in either +the Info file or the printed manual by using the @code{@@ignore} and +@code{@@end ignore} commands. Write each of these commands on a line +of its own, starting each command at the beginning of the line. Text +between these two commands does not appear in the processed output. +You can use @code{@@ignore} and @code{@@end ignore} for writing +comments. Often, @code{@@ignore} and @code{@@end ignore} is used +to enclose a part of the copying permissions that applies to the +Texinfo source file of a document, but not to the Info or printed +version of the document.@refill +@cindex Ignored text +@cindex Unprocessed text +@findex ignore +@c !!! Perhaps include this comment about ignore and ifset: +@ignore +Text enclosed by @code{@@ignore} or by failing @code{@@ifset} or +@code{@@ifclear} conditions is ignored in the sense that it will not +contribute to the formatted output. However, TeX and makeinfo must +still parse the ignored text, in order to understand when to +@emph{stop} ignoring text from the source file; that means that you +will still get error messages if you have invalid Texinfo markup +within ignored text. +@end ignore + +@node Minimum, Six Parts, Comments, Overview +@comment node-name, next, previous, up +@section What a Texinfo File Must Have +@cindex Minimal Texinfo file (requirements) +@cindex Must have in Texinfo file +@cindex Required in Texinfo file +@cindex Texinfo file minimum + +By convention, the names of Texinfo files end with one of the +extensions @file{.texinfo}, @file{.texi}, or @file{.tex}. The longer +extension is preferred since it describes more clearly to a human +reader the nature of the file. The shorter extensions are for +operating systems that cannot handle long file names.@refill + +In order to be made into a printed manual and an Info file, a Texinfo +file @strong{must} begin with lines like this:@refill + +@example +@group +\input texinfo +@@setfilename @var{info-file-name} +@@settitle @var{name-of-manual} +@end group +@end example + +@noindent +The contents of the file follow this beginning, and then you @strong{must} end +a Texinfo file with a line like this:@refill + +@example +@@bye +@end example + +@findex input @r{(@TeX{} command)} +@noindent +The @samp{\input texinfo} line tells @TeX{} to use the +@file{texinfo.tex} file, which tells @TeX{} how to translate the Texinfo +@@-commands into @TeX{} typesetting commands. (Note the use of the +backslash, @samp{\}; this is correct for @TeX{}.) The +@samp{@@setfilename} line provides a name for the Info file and tells +@TeX{} to open auxiliary files. The @samp{@@settitle} line specifies a +title for the page headers (or footers) of the printed manual.@refill + +The @code{@@bye} line at the end of the file on a line of its own tells +the formatters that the file is ended and to stop formatting.@refill + +Usually, you will not use quite such a spare format, but will include +mode setting and start-of-header and end-of-header lines at the +beginning of a Texinfo file, like this:@refill + +@example +@group +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename @var{info-file-name} +@@settitle @var{name-of-manual} +@@c %**end of header +@end group +@end example + +@noindent +In the first line, @samp{-*-texinfo-*-} causes Emacs to switch into +Texinfo mode when you edit the file. + +The @code{@@c} lines which surround the @samp{@@setfilename} and +@samp{@@settitle} lines are optional, but you need them in order to +run @TeX{} or Info on just part of the file. (@xref{Start of Header}, +for more information.)@refill + +Furthermore, you will usually provide a Texinfo file with a title +page, indices, and the like. But the minimum, which can be useful +for short documents, is just the three lines at the beginning and the +one line at the end.@refill + +@node Six Parts, Short Sample, Minimum, Overview +@comment node-name, next, previous, up +@section Six Parts of a Texinfo File + +Generally, a Texinfo file contains more than the minimal +beginning and end---it usually contains six parts:@refill + +@table @r +@item 1. Header +The @dfn{Header} names the file, tells @TeX{} which definitions' file to +use, and performs other ``housekeeping'' tasks.@refill + +@item 2. Summary Description and Copyright +The @dfn{Summary Description and Copyright} segment describes the document +and contains the copyright notice and copying permissions for the Info +file. The segment must be enclosed between @code{@@ifinfo} and +@code{@@end ifinfo} commands so that the formatters place it only in the Info +file.@refill + +@item 3. Title and Copyright +The @dfn{Title and Copyright} segment contains the title and copyright pages +and copying permissions for the printed manual. The segment must be +enclosed between @code{@@titlepage} and @code{@@end titlepage} commands. +The title and copyright page appear only in the printed @w{manual}.@refill + +@item 4. `Top' Node and Master Menu +The @dfn{Master Menu} contains a complete menu of all the nodes in the whole +Info file. It appears only in the Info file, in the `Top' node.@refill + +@item 5. Body +The @dfn{Body} of the document may be structured like a traditional book or +encyclopedia or it may be free form.@refill + +@item 6. End +The @dfn{End} contains commands for printing indices and generating +the table of contents, and the @code{@@bye} command on a line of its +own.@refill +@end table + +@node Short Sample, Acknowledgements, Six Parts, Overview +@comment node-name, next, previous, up +@section A Short Sample Texinfo File +@cindex Sample Texinfo file + +Here is a complete but very short Texinfo file, in six parts. The first +three parts of the file, from @samp{\input texinfo} through to +@samp{@@end titlepage}, look more intimidating than they are. Most of +the material is standard boilerplate; when you write a manual, simply +insert the names for your own manual in this segment. (@xref{Beginning a +File}.)@refill + +@noindent +In the following, the sample text is @emph{indented}; comments on it are +not. The complete file, without any comments, is shown in +@ref{Sample Texinfo File}. + +@subheading Part 1: Header + +@noindent +The header does not appear in either the Info file or the +printed output. It sets various parameters, including the +name of the Info file and the title used in the header. + +@example +@group +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename sample.info +@@settitle Sample Document +@@c %**end of header + +@@setchapternewpage odd +@end group +@end example + +@subheading Part 2: Summary Description and Copyright + +@noindent +The summary description and copyright segment does not +appear in the printed document. + +@example +@group +@@ifinfo +This is a short example of a complete Texinfo file. + +Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. +@@end ifinfo +@end group +@end example + +@subheading Part 3: Titlepage and Copyright + +@noindent +The titlepage segment does not appear in the Info file. + +@example +@group +@@titlepage +@@sp 10 +@@comment The title is printed in a large font. +@@center @@titlefont@{Sample Title@} +@end group + +@group +@@c The following two commands start the copyright page. +@@page +@@vskip 0pt plus 1filll +Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. +@@end titlepage +@end group +@end example + +@subheading Part 4: `Top' Node and Master Menu + +@noindent +The `Top' node contains the master menu for the Info file. +Since a printed manual uses a table of contents rather than +a menu, the master menu appears only in the Info file. + +@example +@group +@@node Top, First Chapter, , (dir) +@@comment node-name, next, previous, up +@end group +@end example + +@example +@group +@@menu +* First Chapter:: The first chapter is the + only chapter in this sample. +* Concept Index:: This index has two entries. +@@end menu +@end group +@end example + +@subheading Part 5: The Body of the Document + +@noindent +The body segment contains all the text of the document, but not the +indices or table of contents. This example illustrates a node and a +chapter containing an enumerated list.@refill + +@example +@group +@@node First Chapter, Concept Index, Top, Top +@@comment node-name, next, previous, up +@@chapter First Chapter +@@cindex Sample index entry +@end group + +@group +This is the contents of the first chapter. +@@cindex Another sample index entry +@end group + +@group +Here is a numbered list. + +@@enumerate +@@item +This is the first item. + +@@item +This is the second item. +@@end enumerate +@end group + +@group +The @@code@{makeinfo@} and @@code@{texinfo-format-buffer@} +commands transform a Texinfo file such as this into +an Info file; and @@TeX@{@} typesets it for a printed +manual. +@end group +@end example + +@subheading Part 6: The End of the Document + +@noindent +The end segment contains commands both for generating an index in a node +and unnumbered chapter of its own and for generating the table of +contents; and it contains the @code{@@bye} command that marks the end of +the document.@refill + +@example +@group +@@node Concept Index, , First Chapter, Top +@@comment node-name, next, previous, up +@@unnumbered Concept Index +@end group + +@group +@@printindex cp + +@@contents +@@bye +@end group +@end example + +@subheading The Results + +Here is what the contents of the first chapter of the sample look like: + +@sp 1 +@need 700 +@quotation +This is the contents of the first chapter. + +Here is a numbered list. + +@enumerate +@item +This is the first item. + +@item +This is the second item. +@end enumerate + +The @code{makeinfo} and @code{texinfo-format-buffer} +commands transform a Texinfo file such as this into +an Info file; and @TeX{} typesets it for a printed +manual. +@end quotation + +@node Acknowledgements, , Short Sample, Overview +@comment node-name, next, previous, up +@section Acknowledgements + +@cindex Stallman, Richard M. +@cindex Chassell, Robert J. +@cindex Berry, Karl +Richard M.@: Stallman wrote Edition 1.0 of this manual. @w{Robert J.@: +Chassell} revised and extended it, starting with Edition 1.1. Karl +Berry made updates for the Texinfo 3.8 and subsequent releases, starting +with Edition 2.22. + +@cindex Pinard, Fran@,{c}ois +@cindex Zuhn, David D. +@cindex Weisshaus, Melissa +Our thanks go out to all who helped improve this work, particularly to +Fran@,{c}ois Pinard and @w{David D.@: Zuhn}, who tirelessly recorded and +reported mistakes and obscurities; our special thanks go to Melissa +Weisshaus for her frequent and often tedious reviews of nearly similar +editions. Our mistakes are our own. + +Please send suggestions and corrections to: + +@example +@group +@r{Internet address:} + bug-texinfo@@prep.ai.mit.edu +@end group +@end example + +@noindent +Please include the manual's edition number and update date in your messages. + +@node Texinfo Mode, Beginning a File, Overview, Top +@comment node-name, next, previous, up +@chapter Using Texinfo Mode +@cindex Texinfo mode +@cindex Mode, using Texinfo +@cindex GNU Emacs +@cindex Emacs + +You may edit a Texinfo file with any text editor you choose. A Texinfo +file is no different from any other @sc{ascii} file. However, GNU Emacs +comes with a special mode, called Texinfo +mode, that provides Emacs commands and tools to help ease your work.@refill + +This chapter describes features of GNU Emacs' Texinfo mode but not any +features of the Texinfo formatting language. If you are reading this +manual straight through from the beginning, you may want to skim through +this chapter briefly and come back to it after reading succeeding +chapters which describe the Texinfo formatting language in +detail.@refill + +@menu +* Texinfo Mode Overview:: How Texinfo mode can help you. +* Emacs Editing:: Texinfo mode adds to GNU Emacs' general + purpose editing features. +* Inserting:: How to insert frequently used @@-commands. +* Showing the Structure:: How to show the structure of a file. +* Updating Nodes and Menus:: How to update or create new nodes and menus. +* Info Formatting:: How to format for Info. +* Printing:: How to format and print part or all of a file. +* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. +@end menu + +@node Texinfo Mode Overview, Emacs Editing, Texinfo Mode, Texinfo Mode +@ifinfo +@heading Texinfo Mode Overview +@end ifinfo + +Texinfo mode provides special features for working with Texinfo +files:@refill + +@itemize @bullet +@item +Insert frequently used @@-commands. @refill + +@item +Automatically create @code{@@node} lines. + +@item +Show the structure of a Texinfo source file.@refill + +@item +Automatically create or update the `Next', +`Previous', and `Up' pointers of a node. + +@item +Automatically create or update menus.@refill + +@item +Automatically create a master menu.@refill + +@item +Format a part or all of a file for Info.@refill + +@item +Typeset and print part or all of a file.@refill +@end itemize + +Perhaps the two most helpful features are those for inserting frequently +used @@-commands and for creating node pointers and menus.@refill + +@node Emacs Editing, Inserting, Texinfo Mode Overview, Texinfo Mode +@section The Usual GNU Emacs Editing Commands + +In most cases, the usual Text mode commands work the same in Texinfo +mode as they do in Text mode. Texinfo mode adds new editing commands +and tools to GNU Emacs' general purpose editing features. The major +difference concerns filling. In Texinfo mode, the paragraph +separation variable and syntax table are redefined so that Texinfo +commands that should be on lines of their own are not inadvertently +included in paragraphs. Thus, the @kbd{M-q} (@code{fill-paragraph}) +command will refill a paragraph but not mix an indexing command on a +line adjacent to it into the paragraph.@refill + +In addition, Texinfo mode sets the @code{page-delimiter} variable to +the value of @code{texinfo-chapter-level-regexp}; by default, this is +a regular expression matching the commands for chapters and their +equivalents, such as appendices. With this value for the page +delimiter, you can jump from chapter title to chapter title with the +@kbd{C-x ]} (@code{forward-page}) and @kbd{C-x [} +(@code{backward-page}) commands and narrow to a chapter with the +@kbd{C-x p} (@code{narrow-to-page}) command. (@xref{Pages, , ,emacs, +The GNU Emacs Manual}, for details about the page commands.)@refill + +You may name a Texinfo file however you wish, but the convention is to +end a Texinfo file name with one of the three extensions +@file{.texinfo}, @file{.texi}, or @file{.tex}. A longer extension is +preferred, since it is explicit, but a shorter extension may be +necessary for operating systems that limit the length of file names. +GNU Emacs automatically enters Texinfo mode when you visit a file with +a @file{.texinfo} or @file{.texi} +extension. Also, Emacs switches to Texinfo mode +when you visit a +file that has @samp{-*-texinfo-*-} in its first line. If ever you are +in another mode and wish to switch to Texinfo mode, type @code{M-x +texinfo-mode}.@refill + +Like all other Emacs features, you can customize or enhance Texinfo +mode as you wish. In particular, the keybindings are very easy to +change. The keybindings described here are the default or standard +ones.@refill + +@node Inserting, Showing the Structure, Emacs Editing, Texinfo Mode +@comment node-name, next, previous, up +@section Inserting Frequently Used Commands +@cindex Inserting frequently used commands +@cindex Frequently used commands, inserting +@cindex Commands, inserting them + +Texinfo mode provides commands to insert various frequently used +@@-commands into the buffer. You can use these commands to save +keystrokes.@refill + +The insert commands are invoked by typing @kbd{C-c} twice and then the +first letter of the @@-command:@refill + +@table @kbd +@item C-c C-c c +@itemx M-x texinfo-insert-@@code +@findex texinfo-insert-@@code +Insert @code{@@code@{@}} and put the +cursor between the braces.@refill + +@item C-c C-c d +@itemx M-x texinfo-insert-@@dfn +@findex texinfo-insert-@@dfn +Insert @code{@@dfn@{@}} and put the +cursor between the braces.@refill + +@item C-c C-c e +@itemx M-x texinfo-insert-@@end +@findex texinfo-insert-@@end +Insert @code{@@end} and attempt to insert the correct following word, +such as @samp{example} or @samp{table}. (This command does not handle +nested lists correctly, but inserts the word appropriate to the +immediately preceding list.)@refill + +@item C-c C-c i +@itemx M-x texinfo-insert-@@item +@findex texinfo-insert-@@item +Insert @code{@@item} and put the +cursor at the beginning of the next line.@refill + +@item C-c C-c k +@itemx M-x texinfo-insert-@@kbd +@findex texinfo-insert-@@kbd +Insert @code{@@kbd@{@}} and put the +cursor between the braces.@refill + +@item C-c C-c n +@itemx M-x texinfo-insert-@@node +@findex texinfo-insert-@@node +Insert @code{@@node} and a comment line +listing the sequence for the `Next', +`Previous', and `Up' nodes. +Leave point after the @code{@@node}.@refill + +@item C-c C-c o +@itemx M-x texinfo-insert-@@noindent +@findex texinfo-insert-@@noindent +Insert @code{@@noindent} and put the +cursor at the beginning of the next line.@refill + +@item C-c C-c s +@itemx M-x texinfo-insert-@@samp +@findex texinfo-insert-@@samp +Insert @code{@@samp@{@}} and put the +cursor between the braces.@refill + +@item C-c C-c t +@itemx M-x texinfo-insert-@@table +@findex texinfo-insert-@@table +Insert @code{@@table} followed by a @key{SPC} +and leave the cursor after the @key{SPC}.@refill + +@item C-c C-c v +@itemx M-x texinfo-insert-@@var +@findex texinfo-insert-@@var +Insert @code{@@var@{@}} and put the +cursor between the braces.@refill + +@item C-c C-c x +@itemx M-x texinfo-insert-@@example +@findex texinfo-insert-@@example +Insert @code{@@example} and put the +cursor at the beginning of the next line.@refill + +@c M-@{ was the binding for texinfo-insert-braces; +@c in Emacs 19, backward-paragraph will take this binding. +@item C-c C-c @{ +@itemx M-x texinfo-insert-braces +@findex texinfo-insert-braces +Insert @code{@{@}} and put the cursor between the braces.@refill + +@item C-c C-c @} +@itemx C-c C-c ] +@itemx M-x up-list +@findex up-list +Move from between a pair of braces forward past the closing brace. +Typing @kbd{C-c C-c ]} is easier than typing @kbd{C-c C-c @}}, which +is, however, more mnemonic; hence the two keybindings. (Also, you can +move out from between braces by typing @kbd{C-f}.)@refill +@end table + +To put a command such as @w{@code{@@code@{@dots{}@}}} around an +@emph{existing} word, position the cursor in front of the word and type +@kbd{C-u 1 C-c C-c c}. This makes it easy to edit existing plain text. +The value of the prefix argument tells Emacs how many words following +point to include between braces---@samp{1} for one word, @samp{2} for +two words, and so on. Use a negative argument to enclose the previous +word or words. If you do not specify a prefix argument, Emacs inserts +the @@-command string and positions the cursor between the braces. This +feature works only for those @@-commands that operate on a word or words +within one line, such as @code{@@kbd} and @code{@@var}.@refill + +This set of insert commands was created after analyzing the frequency +with which different @@-commands are used in the @cite{GNU Emacs +Manual} and the @cite{GDB Manual}. If you wish to add your own insert +commands, you can bind a keyboard macro to a key, use abbreviations, +or extend the code in @file{texinfo.el}.@refill + +@findex texinfo-start-menu-description +@cindex Menu description, start +@cindex Description for menu, start +@kbd{C-c C-c C-d} (@code{texinfo-start-menu-description}) is an insert +command that works differently from the other insert commands. It +inserts a node's section or chapter title in the space for the +description in a menu entry line. (A menu entry has three parts, the +entry name, the node name, and the description. Only the node name is +required, but a description helps explain what the node is about. +@xref{Menu Parts, , The Parts of a Menu}.)@refill + +To use @code{texinfo-start-menu-description}, position point in a menu +entry line and type @kbd{C-c C-c C-d}. The command looks for and copies +the title that goes with the node name, and inserts the title as a +description; it positions point at beginning of the inserted text so you +can edit it. The function does not insert the title if the menu entry +line already contains a description.@refill + +This command is only an aid to writing descriptions; it does not do the +whole job. You must edit the inserted text since a title tends to use +the same words as a node name but a useful description uses different +words.@refill + +@node Showing the Structure, Updating Nodes and Menus, Inserting, Texinfo Mode +@comment node-name, next, previous, up +@section Showing the Section Structure of a File +@cindex Showing the section structure of a file +@cindex Section structure of a file, showing it +@cindex Structure of a file, showing it +@cindex Outline of file structure, showing it +@cindex Contents-like outline of file structure +@cindex File section structure, showing it +@cindex Texinfo file section structure, showing it + +You can show the section structure of a Texinfo file by using the +@kbd{C-c C-s} command (@code{texinfo-show-structure}). This command +shows the section structure of a Texinfo file by listing the lines +that begin with the @@-commands for @code{@@chapter}, +@code{@@section}, and the like. It constructs what amounts +to a table of contents. These lines are displayed in another buffer +called the @samp{*Occur*} buffer. In that buffer, you can position +the cursor over one of the lines and use the @kbd{C-c C-c} command +(@code{occur-mode-goto-occurrence}), to jump to the corresponding spot +in the Texinfo file.@refill + +@table @kbd +@item C-c C-s +@itemx M-x texinfo-show-structure +@findex texinfo-show-structure +Show the @code{@@chapter}, @code{@@section}, and such lines of a +Texinfo file.@refill + +@item C-c C-c +@itemx M-x occur-mode-goto-occurrence +@findex occur-mode-goto-occurrence +Go to the line in the Texinfo file corresponding to the line under the +cursor in the @file{*Occur*} buffer.@refill +@end table + +If you call @code{texinfo-show-structure} with a prefix argument by +typing @w{@kbd{C-u C-c C-s}}, it will list not only those lines with the +@@-commands for @code{@@chapter}, @code{@@section}, and the like, +but also the @code{@@node} lines. (This is how the +@code{texinfo-show-structure} command worked without an argument in +the first version of Texinfo. It was changed because @code{@@node} +lines clutter up the @samp{*Occur*} buffer and are usually not +needed.) You can use @code{texinfo-show-structure} with a prefix +argument to check whether the `Next', `Previous', and `Up' pointers of +an @code{@@node} line are correct.@refill + +Often, when you are working on a manual, you will be interested only +in the structure of the current chapter. In this case, you can mark +off the region of the buffer that you are interested in by using the +@kbd{C-x n n} (@code{narrow-to-region}) command and +@code{texinfo-show-structure} will work on only that region. To see +the whole buffer again, use @w{@kbd{C-x n w}} (@code{widen}). +(@xref{Narrowing, , , emacs, The GNU Emacs Manual}, for more +information about the narrowing commands.)@refill + +@vindex page-delimiter +@cindex Page delimiter in Texinfo mode +In addition to providing the @code{texinfo-show-structure} command, +Texinfo mode sets the value of the page delimiter variable to match +the chapter-level @@-commands. This enables you to use the @kbd{C-x +]} (@code{forward-page}) and @kbd{C-x [} (@code{backward-page}) +commands to move forward and backward by chapter, and to use the +@kbd{C-x p} (@code{narrow-to-page}) command to narrow to a chapter. +@xref{Pages, , , emacs, The GNU Emacs Manual}, for more information +about the page commands.@refill + +@node Updating Nodes and Menus, Info Formatting, Showing the Structure, Texinfo Mode +@comment node-name, next, previous, up +@section Updating Nodes and Menus +@cindex Updating nodes and menus +@cindex Create nodes, menus automatically +@cindex Insert nodes, menus automatically +@cindex Automatically insert nodes, menus + +Texinfo mode provides commands for automatically creating or updating +menus and node pointers. The commands are called ``update'' commands +because their most frequent use is for updating a Texinfo file after +you have worked on it; but you can use them to insert the `Next', +`Previous', and `Up' pointers into an @code{@@node} line that has none and to +create menus in a file that has none.@refill + +If you do not use the updating commands, you need to write menus and +node pointers by hand, which is a tedious task.@refill + +@menu +* Updating Commands:: Five major updating commands. +* Updating Requirements:: How to structure a Texinfo file for + using the updating command. +* Other Updating Commands:: How to indent descriptions, insert + missing nodes lines, and update + nodes in sequence. +@end menu + +@node Updating Commands, Updating Requirements, Updating Nodes and Menus, Updating Nodes and Menus +@ifinfo +@subheading The Updating Commands +@end ifinfo + +You can use the updating commands@refill + +@itemize @bullet +@item +to insert or update the `Next', `Previous', and `Up' pointers of a +node,@refill + +@item +to insert or update the menu for a section, and@refill + +@item +to create a master menu for a Texinfo source file.@refill +@end itemize + +You can also use the commands to update all the nodes and menus in a +region or in a whole Texinfo file.@refill + +The updating commands work only with conventional Texinfo files, which +are structured hierarchically like books. In such files, a structuring +command line must follow closely after each @code{@@node} line, except +for the `Top' @code{@@node} line. (A @dfn{structuring command line} is +a line beginning with @code{@@chapter}, @code{@@section}, or other +similar command.) + +You can write the structuring command line on the line that follows +immediately after an @code{@@node} line or else on the line that +follows after a single @code{@@comment} line or a single +@code{@@ifinfo} line. You cannot interpose more than one line between +the @code{@@node} line and the structuring command line; and you may +interpose only an @code{@@comment} line or an @code{@@ifinfo} line. + +Commands which work on a whole buffer require that the `Top' node be +followed by a node with an @code{@@chapter} or equivalent-level command. +Note that the menu updating commands will not create a main or master +menu for a Texinfo file that has only @code{@@chapter}-level nodes! The +menu updating commands only create menus @emph{within} nodes for lower level +nodes. To create a menu of chapters, you must provide a `Top' +node.@refill + +The menu updating commands remove menu entries that refer to other Info +files since they do not refer to nodes within the current buffer. This +is a deficiency. Rather than use menu entries, you can use cross +references to refer to other Info files. None of the updating commands +affect cross references.@refill + +Texinfo mode has five updating commands that are used most often: two +are for updating the node pointers or menu of a single node (or a +region); two are for updating every node pointer and menu in a file; +and one, the @code{texinfo-master-menu} command, is for creating a +master menu for a complete file, and optionally, for updating every +node and menu in the whole Texinfo file.@refill + +The @code{texinfo-master-menu} command is the primary command:@refill + +@table @kbd +@item C-c C-u m +@itemx M-x texinfo-master-menu +@findex texinfo-master-menu +Create or update a master menu that includes all the other menus +(incorporating the descriptions from pre-existing menus, if +any).@refill + +With an argument (prefix argument, @kbd{C-u,} if interactive), first create or +update all the nodes and all the regular menus in the buffer before +constructing the master menu. (@xref{The Top Node, , The Top Node and +Master Menu}, for more about a master menu.)@refill + +For @code{texinfo-master-menu} to work, the Texinfo file must have a +`Top' node and at least one subsequent node.@refill + +After extensively editing a Texinfo file, you can type the following: + +@example +C-u M-x texinfo-master-menu +@exdent or +C-u C-c C-u m +@end example + +@noindent +This updates all the nodes and menus completely and all at once.@refill +@end table + +The other major updating commands do smaller jobs and are designed for +the person who updates nodes and menus as he or she writes a Texinfo +file.@refill + +@need 1000 +The commands are:@refill + +@table @kbd +@item C-c C-u C-n +@itemx M-x texinfo-update-node +@findex texinfo-update-node +Insert the `Next', `Previous', and `Up' pointers for the node that point is +within (i.e., for the @code{@@node} line preceding point). If the +@code{@@node} line has pre-existing `Next', `Previous', or `Up' +pointers in it, the old pointers are removed and new ones inserted. +With an argument (prefix argument, @kbd{C-u}, if interactive), this command +updates all @code{@@node} lines in the region (which is the text +between point and mark).@refill + +@item C-c C-u C-m +@itemx M-x texinfo-make-menu +@findex texinfo-make-menu +Create or update the menu in the node that point is within. +With an argument (@kbd{C-u} as prefix argument, if +interactive), the command makes or updates menus for the +nodes which are either within or a part of the +region.@refill + +Whenever @code{texinfo-make-menu} updates an existing menu, the +descriptions from that menu are incorporated into the new menu. This +is done by copying descriptions from the existing menu to the entries +in the new menu that have the same node names. If the node names are +different, the descriptions are not copied to the new menu.@refill + +@item C-c C-u C-e +@itemx M-x texinfo-every-node-update +@findex texinfo-every-node-update +Insert or update the `Next', `Previous', and `Up' pointers for every +node in the buffer.@refill + +@item C-c C-u C-a +@itemx M-x texinfo-all-menus-update +@findex texinfo-all-menus-update +Create or update all the menus in the buffer. With an argument +(@kbd{C-u} as prefix argument, if interactive), first insert +or update all the node +pointers before working on the menus.@refill + +If a master menu exists, the @code{texinfo-all-menus-update} command +updates it; but the command does not create a new master menu if none +already exists. (Use the @code{texinfo-master-menu} command for +that.)@refill + +When working on a document that does not merit a master menu, you can +type the following: + +@example +C-u C-c C-u C-a +@exdent or +C-u M-x texinfo-all-menus-update +@end example + +@noindent +This updates all the nodes and menus.@refill +@end table + +The @code{texinfo-column-for-description} variable specifies the +column to which menu descriptions are indented. By default, the value +is 32 although it is often useful to reduce it to as low as 24. You +can set the variable with the @kbd{M-x edit-options} command +(@pxref{Edit Options, , Editing Variable Values, emacs, The GNU Emacs +Manual}) or with the @kbd{M-x set-variable} command (@pxref{Examining, +, Examining and Setting Variables, emacs, The GNU Emacs +Manual}).@refill + +Also, the @code{texinfo-indent-menu-description} command may be used to +indent existing menu descriptions to a specified column. Finally, if +you wish, you can use the @code{texinfo-insert-node-lines} command to +insert missing @code{@@node} lines into a file. (@xref{Other Updating +Commands}, for more information.)@refill + +@node Updating Requirements, Other Updating Commands, Updating Commands, Updating Nodes and Menus +@comment node-name, next, previous, up +@subsection Updating Requirements +@cindex Updating requirements +@cindex Requirements for updating commands + +To use the updating commands, you must organize the Texinfo file +hierarchically with chapters, sections, subsections, and the like. +When you construct the hierarchy of the manual, do not `jump down' +more than one level at a time: you can follow the `Top' node with a +chapter, but not with a section; you can follow a chapter with a +section, but not with a subsection. However, you may `jump up' any +number of levels at one time---for example, from a subsection to a +chapter.@refill + +Each @code{@@node} line, with the exception of the line for the `Top' +node, must be followed by a line with a structuring command such as +@code{@@chapter}, @code{@@section}, or +@code{@@unnumberedsubsec}.@refill + +Each @code{@@node} line/structuring-command line combination +must look either like this:@refill + +@example +@group +@@node Comments, Minimum, Conventions, Overview +@@comment node-name, next, previous, up +@@section Comments +@end group +@end example + +or like this (without the @code{@@comment} line): + +@example +@group +@@node Comments, Minimum, Conventions, Overview +@@section Comments +@end group +@end example + +@noindent +In this example, `Comments' is the name of both the node and the +section. The next node is called `Minimum' and the previous node is +called `Conventions'. The `Comments' section is within the `Overview' +node, which is specified by the `Up' pointer. (Instead of an +@code{@@comment} line, you can write an @code{@@ifinfo} line.)@refill + +If a file has a `Top' node, it must be called @samp{top} or @samp{Top} +and be the first node in the file.@refill + +The menu updating commands create a menu of sections within a chapter, +a menu of subsections within a section, and so on. This means that +you must have a `Top' node if you want a menu of chapters.@refill + +Incidentally, the @code{makeinfo} command will create an Info file for +a hierarchically organized Texinfo file that lacks `Next', `Previous' +and `Up' pointers. Thus, if you can be sure that your Texinfo file +will be formatted with @code{makeinfo}, you have no need for the +`update node' commands. (@xref{Create an Info File, , Creating an +Info File}, for more information about @code{makeinfo}.) However, +both @code{makeinfo} and the @code{texinfo-format-@dots{}} commands +require that you insert menus in the file.@refill + +@node Other Updating Commands, , Updating Requirements, Updating Nodes and Menus +@comment node-name, next, previous, up +@subsection Other Updating Commands + +In addition to the five major updating commands, Texinfo mode +possesses several less frequently used updating commands:@refill + +@table @kbd +@item M-x texinfo-insert-node-lines +@findex texinfo-insert-node-lines +Insert @code{@@node} lines before the @code{@@chapter}, +@code{@@section}, and other sectioning commands wherever they are +missing throughout a region in a Texinfo file.@refill + +With an argument (@kbd{C-u} as prefix argument, if interactive), the +@code{texinfo-insert-node-lines} command not only inserts +@code{@@node} lines but also inserts the chapter or section titles as +the names of the corresponding nodes. In addition, it inserts the +titles as node names in pre-existing @code{@@node} lines that lack +names. Since node names should be more concise than section or +chapter titles, you must manually edit node names so inserted.@refill + +For example, the following marks a whole buffer as a region and inserts +@code{@@node} lines and titles throughout:@refill + +@example +C-x h C-u M-x texinfo-insert-node-lines +@end example + +(Note that this command inserts titles as node names in @code{@@node} +lines; the @code{texinfo-start-menu-description} command +(@pxref{Inserting, Inserting Frequently Used Commands}) inserts titles +as descriptions in menu entries, a different action. However, in both +cases, you need to edit the inserted text.)@refill + +@item M-x texinfo-multiple-files-update +@findex texinfo-multiple-files-update @r{(in brief)} +Update nodes and menus in a document built from several separate files. +With @kbd{C-u} as a prefix argument, create and insert a master menu in +the outer file. With a numeric prefix argument, such as @kbd{C-u 2}, first +update all the menus and all the `Next', `Previous', and `Up' pointers +of all the included files before creating and inserting a master menu in +the outer file. The @code{texinfo-multiple-files-update} command is +described in the appendix on @code{@@include} files. +@ifinfo +@xref{texinfo-multiple-files-update}.@refill +@end ifinfo +@iftex +@xref{texinfo-multiple-files-update, , +@code{texinfo-multiple-files-update}}.@refill +@end iftex + +@item M-x texinfo-indent-menu-description +@findex texinfo-indent-menu-description +Indent every description in the menu following point to the specified +column. You can use this command to give yourself more space for +descriptions. With an argument (@kbd{C-u} as prefix argument, if +interactive), the @code{texinfo-indent-menu-description} command indents +every description in every menu in the region. However, this command +does not indent the second and subsequent lines of a multi-line +description.@refill + +@item M-x texinfo-sequential-node-update +@findex texinfo-sequential-node-update +Insert the names of the nodes immediately following and preceding the +current node as the `Next' or `Previous' pointers regardless of those +nodes' hierarchical level. This means that the `Next' node of a +subsection may well be the next chapter. Sequentially ordered nodes are +useful for novels and other documents that you read through +sequentially. (However, in Info, the @kbd{g *} command lets +you look through the file sequentially, so sequentially ordered nodes +are not strictly necessary.) With an argument (prefix argument, if +interactive), the @code{texinfo-sequential-node-update} command +sequentially updates all the nodes in the region.@refill +@end table + +@node Info Formatting, Printing, Updating Nodes and Menus, Texinfo Mode +@comment node-name, next, previous, up +@section Formatting for Info +@cindex Formatting for Info +@cindex Running an Info formatter +@cindex Info formatting + +Texinfo mode provides several commands for formatting part or all of a +Texinfo file for Info. Often, when you are writing a document, you +want to format only part of a file---that is, a region.@refill + +You can use either the @code{texinfo-format-region} or the +@code{makeinfo-region} command to format a region:@refill + +@table @kbd +@findex texinfo-format-region +@item C-c C-e C-r +@itemx M-x texinfo-format-region +@itemx C-c C-m C-r +@itemx M-x makeinfo-region +Format the current region for Info.@refill +@end table + +You can use either the @code{texinfo-format-buffer} or the +@code{makeinfo-buffer} command to format a whole buffer:@refill + +@table @kbd +@findex texinfo-format-buffer +@item C-c C-e C-b +@itemx M-x texinfo-format-buffer +@itemx C-c C-m C-b +@itemx M-x makeinfo-buffer +Format the current buffer for Info.@refill +@end table + +@need 1000 +For example, after writing a Texinfo file, you can type the following: + +@example +C-u C-c C-u m +@exdent or +C-u M-x texinfo-master-menu +@end example + +@noindent +This updates all the nodes and menus. Then type the following to create +an Info file: + +@example +C-c C-m C-b +@exdent or +M-x makeinfo-buffer +@end example + +For @TeX{} or the Info formatting commands to work, the file @emph{must} +include a line that has @code{@@setfilename} in its header.@refill + +@xref{Create an Info File}, for details about Info formatting.@refill + +@node Printing, Texinfo Mode Summary, Info Formatting, Texinfo Mode +@comment node-name, next, previous, up +@section Formatting and Printing +@cindex Formatting for printing +@cindex Printing a region or buffer +@cindex Region formatting and printing +@cindex Buffer formatting and printing +@cindex Part of file formatting and printing + +Typesetting and printing a Texinfo file is a multi-step process in which +you first create a file for printing (called a DVI file), and then +print the file. Optionally, you may also create indices. To do this, +you must run the @code{texindex} command after first running the +@code{tex} typesetting command; and then you must run the @code{tex} +command again. Or else run the @code{texi2dvi} command which +automatically creates indices as needed.@refill + +Often, when you are writing a document, you want to typeset and print +only part of a file to see what it will look like. You can use the +@code{texinfo-tex-region} and related commands for this purpose. Use +the @code{texinfo-tex-buffer} command to format all of a +buffer.@refill + +@table @kbd +@item C-c C-t C-b +@itemx M-x texinfo-tex-buffer +@findex texinfo-tex-buffer +Run @code{texi2dvi} on the buffer. In addition to running @TeX{} on the +buffer, this command automatically creates or updates indices as +needed.@refill + +@item C-c C-t C-r +@itemx M-x texinfo-tex-region +@findex texinfo-tex-region +Run @TeX{} on the region.@refill + +@item C-c C-t C-i +@itemx M-x texinfo-texindex +Run @code{texindex} to sort the indices of a Texinfo file formatted with +@code{texinfo-tex-region}. The @code{texinfo-tex-region} command does +not run @code{texindex} automatically; it only runs the @code{tex} +typesetting command. You must run the @code{texinfo-tex-region} command +a second time after sorting the raw index files with the @code{texindex} +command. (Usually, you do not format an index when you format a region, +only when you format a buffer. Now that the @code{texi2dvi} command +exists, there is little or no need for this command.)@refill + +@item C-c C-t C-p +@itemx M-x texinfo-tex-print +@findex texinfo-tex-print +Print the file (or the part of the file) previously formatted with +@code{texinfo-tex-buffer} or @code{texinfo-tex-region}.@refill +@end table + +For @code{texinfo-tex-region} or @code{texinfo-tex-buffer} to work, the +file @emph{must} start with a @samp{\input texinfo} line and must +include an @code{@@settitle} line. The file must end with @code{@@bye} +on a line by itself. (When you use @code{texinfo-tex-region}, you must +surround the @code{@@settitle} line with start-of-header and +end-of-header lines.)@refill + +@xref{Format/Print Hardcopy}, for a description of the other @TeX{} related +commands, such as @code{tex-show-print-queue}.@refill + +@node Texinfo Mode Summary, , Printing, Texinfo Mode +@comment node-name, next, previous, up +@section Texinfo Mode Summary + +In Texinfo mode, each set of commands has default keybindings that +begin with the same keys. All the commands that are custom-created +for Texinfo mode begin with @kbd{C-c}. The keys are somewhat +mnemonic.@refill + +@subheading Insert Commands + +The insert commands are invoked by typing @kbd{C-c} twice and then the +first letter of the @@-command to be inserted. (It might make more +sense mnemonically to use @kbd{C-c C-i}, for `custom insert', but +@kbd{C-c C-c} is quick to type.)@refill + +@example +C-c C-c c @r{Insert} @samp{@@code}. +C-c C-c d @r{Insert} @samp{@@dfn}. +C-c C-c e @r{Insert} @samp{@@end}. +C-c C-c i @r{Insert} @samp{@@item}. +C-c C-c n @r{Insert} @samp{@@node}. +C-c C-c s @r{Insert} @samp{@@samp}. +C-c C-c v @r{Insert} @samp{@@var}. +C-c C-c @{ @r{Insert braces.} +C-c C-c ] +C-c C-c @} @r{Move out of enclosing braces.} + +@group +C-c C-c C-d @r{Insert a node's section title} + @r{in the space for the description} + @r{in a menu entry line.} +@end group +@end example + +@subheading Show Structure + +The @code{texinfo-show-structure} command is often used within a +narrowed region.@refill + +@example +C-c C-s @r{List all the headings.} +@end example + +@subheading The Master Update Command + +The @code{texinfo-master-menu} command creates a master menu; and can +be used to update every node and menu in a file as well.@refill + +@example +@group +C-c C-u m +M-x texinfo-master-menu + @r{Create or update a master menu.} +@end group + +@group +C-u C-c C-u m @r{With @kbd{C-u} as a prefix argument, first} + @r{create or update all nodes and regular} + @r{menus, and then create a master menu.} +@end group +@end example + +@subheading Update Pointers + +The update pointer commands are invoked by typing @kbd{C-c C-u} and +then either @kbd{C-n} for @code{texinfo-update-node} or @kbd{C-e} for +@code{texinfo-every-node-update}.@refill + +@example +C-c C-u C-n @r{Update a node.} +C-c C-u C-e @r{Update every node in the buffer.} +@end example + +@subheading Update Menus + +Invoke the update menu commands by typing @kbd{C-c C-u} +and then either @kbd{C-m} for @code{texinfo-make-menu} or +@kbd{C-a} for @code{texinfo-all-menus-update}. To update +both nodes and menus at the same time, precede @kbd{C-c C-u +C-a} with @kbd{C-u}.@refill + +@example +C-c C-u C-m @r{Make or update a menu.} + +@group +C-c C-u C-a @r{Make or update all} + @r{menus in a buffer.} +@end group + +@group +C-u C-c C-u C-a @r{With @kbd{C-u} as a prefix argument,} + @r{first create or update all nodes and} + @r{then create or update all menus.} +@end group +@end example + +@subheading Format for Info + +The Info formatting commands that are written in Emacs Lisp are +invoked by typing @kbd{C-c C-e} and then either @kbd{C-r} for a region +or @kbd{C-b} for the whole buffer.@refill + +The Info formatting commands that are written in C and based on the +@code{makeinfo} program are invoked by typing @kbd{C-c C-m} and then +either @kbd{C-r} for a region or @kbd{C-b} for the whole buffer.@refill + +@need 800 +@noindent +Use the @code{texinfo-format@dots{}} commands: + +@example +@group +C-c C-e C-r @r{Format the region.} +C-c C-e C-b @r{Format the buffer.} +@end group +@end example + +@need 750 +@noindent +Use @code{makeinfo}: + +@example +C-c C-m C-r @r{Format the region.} +C-c C-m C-b @r{Format the buffer.} +C-c C-m C-l @r{Recenter the @code{makeinfo} output buffer.} +C-c C-m C-k @r{Kill the @code{makeinfo} formatting job.} +@end example + +@subheading Typeset and Print + +The @TeX{} typesetting and printing commands are invoked by typing +@kbd{C-c C-t} and then another control command: @kbd{C-r} for +@code{texinfo-tex-region}, @kbd{C-b} for @code{texinfo-tex-buffer}, +and so on.@refill + +@example +C-c C-t C-r @r{Run @TeX{} on the region.} +C-c C-t C-b @r{Run} @code{texi2dvi} @r{on the buffer.} +C-c C-t C-i @r{Run} @code{texindex}. +C-c C-t C-p @r{Print the DVI file.} +C-c C-t C-q @r{Show the print queue.} +C-c C-t C-d @r{Delete a job from the print queue.} +C-c C-t C-k @r{Kill the current @TeX{} formatting job.} +C-c C-t C-x @r{Quit a currently stopped @TeX{} formatting job.} +C-c C-t C-l @r{Recenter the output buffer.} +@end example + +@subheading Other Updating Commands + +The `other updating commands' do not have standard keybindings because +they are rarely used. + +@example +@group +M-x texinfo-insert-node-lines + @r{Insert missing @code{@@node} lines in region.} + @r{With @kbd{C-u} as a prefix argument,} + @r{use section titles as node names.} +@end group + +@group +M-x texinfo-multiple-files-update + @r{Update a multi-file document.} + @r{With @kbd{C-u 2} as a prefix argument,} + @r{create or update all nodes and menus} + @r{in all included files first.} +@end group + +@group +M-x texinfo-indent-menu-description + @r{Indent descriptions.} +@end group + +@group +M-x texinfo-sequential-node-update + @r{Insert node pointers in strict sequence.} +@end group +@end example + +@node Beginning a File, Ending a File, Texinfo Mode, Top +@comment node-name, next, previous, up +@chapter Beginning a Texinfo File +@cindex Beginning a Texinfo file +@cindex Texinfo file beginning +@cindex File beginning + +Certain pieces of information must be provided at the beginning of a +Texinfo file, such as the name of the file and the title of the +document.@refill + +@menu +* Four Parts:: Four parts begin a Texinfo file. +* Sample Beginning:: Here is a sample beginning for a Texinfo file. +* Header:: The very beginning of a Texinfo file. +* Info Summary and Permissions:: Summary and copying permissions for Info. +* Titlepage & Copyright Page:: Creating the title and copyright pages. +* The Top Node:: Creating the `Top' node and master menu. +* Software Copying Permissions:: Ensure that you and others continue to + have the right to use and share software. +@end menu + +@node Four Parts, Sample Beginning, Beginning a File, Beginning a File +@ifinfo +@heading Four Parts Begin a File +@end ifinfo + +Generally, the beginning of a Texinfo file has four parts:@refill + +@enumerate +@item +The header, delimited by special comment lines, that includes the +commands for naming the Texinfo file and telling @TeX{} what +definitions file to use when processing the Texinfo file.@refill + +@item +A short statement of what the file is about, with a copyright notice +and copying permissions. This is enclosed in @code{@@ifinfo} and +@code{@@end ifinfo} commands so that the formatters place it only +in the Info file.@refill + +@item +A title page and copyright page, with a copyright notice and copying +permissions. This is enclosed between @code{@@titlepage} and +@code{@@end titlepage} commands. The title and copyright page appear +only in the printed @w{manual}.@refill + +@item +The `Top' node that contains a menu for the whole Info file. The +contents of this node appear only in the Info file.@refill +@end enumerate + +Also, optionally, you may include the copying conditions for a program +and a warranty disclaimer. The copying section will be followed by an +introduction or else by the first chapter of the manual.@refill + +Since the copyright notice and copying permissions for the Texinfo +document (in contrast to the copying permissions for a program) are in +parts that appear only in the Info file or only in the printed manual, +this information must be given twice.@refill + +@node Sample Beginning, Header, Four Parts, Beginning a File +@comment node-name, next, previous, up +@section Sample Texinfo File Beginning + +The following sample shows what is needed.@refill + +@example +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename @var{name-of-info-file} +@@settitle @var{name-of-manual} +@@setchapternewpage odd +@@c %**end of header + +@@ifinfo +This file documents @dots{} + +Copyright @var{year} @var{copyright-owner} + +@group +Permission is granted to @dots{} +@@end ifinfo +@end group + +@group +@@c This title page illustrates only one of the +@@c two methods of forming a title page. +@end group + +@group +@@titlepage +@@title @var{name-of-manual-when-printed} +@@subtitle @var{subtitle-if-any} +@@subtitle @var{second-subtitle} +@@author @var{author} +@end group + +@group +@@c The following two commands +@@c start the copyright page. +@@page +@@vskip 0pt plus 1filll +Copyright @@copyright@{@} @var{year} @var{copyright-owner} +@end group + +Published by @dots{} + +Permission is granted to @dots{} +@@end titlepage + +@@node Top, Overview, , (dir) + +@@ifinfo +This document describes @dots{} + +This document applies to version @dots{} +of the program named @dots{} +@@end ifinfo + +@group +@@menu +* Copying:: Your rights and freedoms. +* First Chapter:: Getting started @dots{} +* Second Chapter:: @dots{} + @dots{} + @dots{} +@@end menu +@end group + +@group +@@node First Chapter, Second Chapter, top, top +@@comment node-name, next, previous, up +@@chapter First Chapter +@@cindex Index entry for First Chapter +@end group +@end example + +@node Header, Info Summary and Permissions, Sample Beginning, Beginning a File +@comment node-name, next, previous, up +@section The Texinfo File Header +@cindex Header for Texinfo files +@cindex Texinfo file header + +Texinfo files start with at least three lines that provide Info and +@TeX{} with necessary information. These are the @code{\input +texinfo} line, the @code{@@settitle} line, and the +@code{@@setfilename} line. If you want to run @TeX{} on just a part +of the Texinfo File, you must write the @code{@@settitle} +and @code{@@setfilename} lines between start-of-header and end-of-header +lines.@refill + +Thus, the beginning of a Texinfo file looks like this: + +@example +@group +\input texinfo @@c -*-texinfo-*- +@@setfilename sample.info +@@settitle Sample Document +@end group +@end example + +@noindent +or else like this: + +@example +@group +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename sample.info +@@settitle Sample Document +@@c %**end of header +@end group +@end example + +@menu +* First Line:: The first line of a Texinfo file. +* Start of Header:: Formatting a region requires this. +* setfilename:: Tell Info the name of the Info file. +* settitle:: Create a title for the printed work. +* setchapternewpage:: Start chapters on right-hand pages. +* paragraphindent:: An option to specify paragraph indentation. +* End of Header:: Formatting a region requires this. +@end menu + +@node First Line, Start of Header, Header, Header +@comment node-name, next, previous, up +@subsection The First Line of a Texinfo File +@cindex First line of a Texinfo file +@cindex Beginning line of a Texinfo file +@cindex Header of a Texinfo file + +Every Texinfo file that is to be the top-level input to @TeX{} must begin +with a line that looks like this:@refill + +@example +\input texinfo @@c -*-texinfo-*- +@end example + +@noindent +This line serves two functions: + +@enumerate +@item +When the file is processed by @TeX{}, the @samp{\input texinfo} command +tells @TeX{} to load the macros needed for processing a Texinfo file. +These are in a file called @file{texinfo.tex}, which is usually located +in the @file{/usr/lib/tex/macros} directory. @TeX{} uses the backslash, +@samp{\}, to mark the beginning of a command, just as Texinfo uses +@samp{@@}. The @file{texinfo.tex} file causes the switch from @samp{\} +to @samp{@@}; before the switch occurs, @TeX{} requires @samp{\}, which +is why it appears at the beginning of the file.@refill + +@item +When the file is edited in GNU Emacs, the @samp{-*-texinfo-*-} mode +specification tells Emacs to use Texinfo mode.@refill +@end enumerate + +@node Start of Header, setfilename, First Line, Header +@comment node-name, next, previous, up +@subsection Start of Header +@cindex Start of header line + +Write a start-of-header line on the second line of a Texinfo file. +Follow the start-of-header line with @code{@@setfilename} and +@code{@@settitle} lines and, optionally, with other command lines, such +as @code{@@smallbook} or @code{@@footnotestyle}; and then by an +end-of-header line (@pxref{End of Header}).@refill + +With these lines, you can format part of a Texinfo file for Info or +typeset part for printing.@refill + +A start-of-header line looks like this:@refill + +@example +@@c %**start of header +@end example + +The odd string of characters, @samp{%**}, is to ensure that no other +comment is accidentally taken for a start-of-header line.@refill + +@node setfilename, settitle, Start of Header, Header +@comment node-name, next, previous, up +@subsection @code{@@setfilename} +@cindex Info file requires @code{@@setfilename} +@findex setfilename + +In order to serve as the primary input file for either @code{makeinfo} +or @TeX{}, a Texinfo file must contain a line that looks like this: + +@example +@@setfilename @var{info-file-name} +@end example + +Write the @code{@@setfilename} command at the beginning of a line and +follow it on the same line by the Info file name. Do not write anything +else on the line; anything on the line after the command is considered +part of the file name, including what would otherwise be a +comment. + +The @code{@@setfilename} line specifies the name of the Info file to be +generated. This name should be different from the name of the Texinfo +file. There are two conventions for choosing the name: you can either +remove the @samp{.texi} extension from the input file name, or replace +it with the @samp{.info} extension. + +Some operating systems cannot handle long file names. You can run into +a problem even when the file name you specify is itself short enough. +This occurs because the Info formatters split a long Info file into +short indirect subfiles, and name them by appending @samp{-1}, +@samp{-2}, @dots{}, @samp{-10}, @samp{-11}, and so on, to the original +file name. (@xref{Tag and Split Files, , Tag Files and Split Files}.) +The subfile name @file{texinfo.info-10}, for example, is too long for +some systems; so the Info file name for this document is @file{texinfo} +rather than @file{texinfo.info}. + +@cindex Ignored before @code{@@setfilename} +The Info formatting commands ignore everything written before the +@code{@@setfilename} line, which is why the very first line of +the file (the @code{\input} line) does not show up in the output. + +@pindex texinfo.cnf +The @code{@@setfilename} line produces no output when you typeset a +manual with @TeX{}, but it nevertheless is essential: it opens the +index, cross-reference, and other auxiliary files used by Texinfo, and +also reads @file{texinfo.cnf} if that file is present on your system +(@pxref{Preparing for TeX,, Preparing to Use @TeX{}}). + + +@node settitle, setchapternewpage, setfilename, Header +@comment node-name, next, previous, up +@subsection @code{@@settitle} +@findex settitle + +In order to be made into a printed manual, a Texinfo file must contain +a line that looks like this:@refill + +@example +@@settitle @var{title} +@end example + +Write the @code{@@settitle} command at the beginning of a line and +follow it on the same line by the title. This tells @TeX{} the title +to use in a header or footer. Do not write anything else on the line; +anything on the line after the command is considered part of the +title, including a comment.@refill + +Conventionally, when @TeX{} formats a Texinfo file for double-sided +output, the title is printed in the left-hand (even-numbered) page +headings and the current chapter title is printed in the right-hand +(odd-numbered) page headings. (@TeX{} learns the title of each chapter +from each @code{@@chapter} command.) Page footers are not +printed.@refill + +Even if you are printing in a single-sided style, @TeX{} looks for an +@code{@@settitle} command line, in case you include the manual title +in the heading. @refill + +The @code{@@settitle} command should precede everything that generates +actual output in @TeX{}.@refill + +Although the title in the @code{@@settitle} command is usually the +same as the title on the title page, it does not affect the title as +it appears on the title page. Thus, the two do not need not match +exactly; and the title in the @code{@@settitle} command can be a +shortened or expanded version of the title as it appears on the title +page. (@xref{titlepage, , @code{@@titlepage}}.)@refill + +@TeX{} prints page headings only for that text that comes after the +@code{@@end titlepage} command in the Texinfo file, or that comes +after an @code{@@headings} command that turns on headings. +(@xref{headings on off, , The @code{@@headings} Command}, for more +information.)@refill + +You may, if you wish, create your own, customized headings and +footings. @xref{Headings, , Page Headings}, for a detailed discussion +of this process.@refill + +@node setchapternewpage, paragraphindent, settitle, Header +@comment node-name, next, previous, up +@subsection @code{@@setchapternewpage} +@cindex Starting chapters +@cindex Pages, starting odd +@findex setchapternewpage + +In a book or a manual, text is usually printed on both sides of the +paper, chapters start on right-hand pages, and right-hand pages have +odd numbers. But in short reports, text often is printed only on one +side of the paper. Also in short reports, chapters sometimes do not +start on new pages, but are printed on the same page as the end of the +preceding chapter, after a small amount of vertical whitespace.@refill + +You can use the @code{@@setchapternewpage} command with various +arguments to specify how @TeX{} should start chapters and whether it +should typeset pages for printing on one or both sides of the paper +(single-sided or double-sided printing).@refill + +Write the @code{@@setchapternewpage} command at the beginning of a +line followed by its argument.@refill + +For example, you would write the following to cause each chapter to +start on a fresh odd-numbered page:@refill + +@example +@@setchapternewpage odd +@end example + +You can specify one of three alternatives with the +@code{@@setchapternewpage} command:@refill + +@table @asis +@ignore +@item No @code{@@setchapternewpage} command +If the Texinfo file does not contain an @code{@@setchapternewpage} +command before the @code{@@titlepage} command, @TeX{} automatically +begins chapters on new pages and prints headings in the standard +format for single-sided printing. This is the conventional format for +single-sided printing.@refill + +The result is exactly the same as when you write +@code{@@setchapternewpage on}.@refill +@end ignore +@item @code{@@setchapternewpage off} +Cause @TeX{} to typeset a new chapter on the same page as the last +chapter, after skipping some vertical whitespace. Also, cause @TeX{} to +format page headers for single-sided printing. (You can override the +headers format with the @code{@@headings double} command; see +@ref{headings on off, , The @code{@@headings} Command}.)@refill + +@item @code{@@setchapternewpage on} +Cause @TeX{} to start new chapters on new pages and to typeset page +headers for single-sided printing. This is the form most often +used for short reports.@refill + +This alternative is the default.@refill + +@item @code{@@setchapternewpage odd} +Cause @TeX{} to start new chapters on new, odd-numbered pages +(right-handed pages) and to typeset for double-sided printing. This is +the form most often used for books and manuals.@refill +@end table + +@noindent +Texinfo does not have an @code{@@setchapternewpage even} command.@refill + +@noindent +(You can countermand or modify an @code{@@setchapternewpage} command +with an @code{@@headings} command. @xref{headings on off, , The +@code{@@headings} Command}.)@refill + +At the beginning of a manual or book, pages are not numbered---for +example, the title and copyright pages of a book are not numbered. +By convention, table of contents pages are numbered with roman +numerals and not in sequence with the rest of the document.@refill + +Since an Info file does not have pages, the @code{@@setchapternewpage} +command has no effect on it.@refill + +Usually, you do not write an @code{@@setchapternewpage} command for +single-sided printing, but accept the default which is to typeset for +single-sided printing and to start new chapters on new pages. Usually, +you write an @code{@@setchapternewpage odd} command for double-sided +printing.@refill + +@node paragraphindent, End of Header, setchapternewpage, Header +@comment node-name, next, previous, up +@subsection Paragraph Indenting +@cindex Indenting paragraphs +@cindex Paragraph indentation +@findex paragraphindent + +The Info formatting commands may insert spaces at the beginning of the +first line of each paragraph, thereby indenting that paragraph. You +can use the @code{@@paragraphindent} command to specify the +indentation. Write an @code{@@paragraphindent} command at the +beginning of a line followed by either @samp{asis} or a number. The +template is:@refill + +@example +@@paragraphindent @var{indent} +@end example + +The Info formatting commands indent according to the value of +@var{indent}:@refill + +@itemize @bullet +@item +If the value of @var{indent} is @samp{asis}, the Info formatting +commands do not change the existing indentation.@refill + +@item +If the value of @var{indent} is zero, the Info formatting commands delete +existing indentation.@refill + +@item +If the value of @var{indent} is greater than zero, the Info formatting +commands indent the paragraph by that number of spaces.@refill +@end itemize + +The default value of @var{indent} is @samp{asis}.@refill + +Write the @code{@@paragraphindent} command before or shortly after the +end-of-header line at the beginning of a Texinfo file. (If you write +the command between the start-of-header and end-of-header lines, the +region formatting commands indent paragraphs as specified.)@refill + +A peculiarity of the @code{texinfo-format-buffer} and +@code{texinfo-format-region} commands is that they do not indent (nor +fill) paragraphs that contain @code{@@w} or @code{@@*} commands. +@xref{Refilling Paragraphs}, for a detailed description of what goes +on.@refill + +@node End of Header, , paragraphindent, Header +@comment node-name, next, previous, up +@subsection End of Header +@cindex End of header line + +Follow the header lines with an @w{end-of-header} line. +An end-of-header line looks like this:@refill + +@example +@@c %**end of header +@end example + +If you include the @code{@@setchapternewpage} command between the +start-of-header and end-of-header lines, @TeX{} will typeset a region as +that command specifies. Similarly, if you include an @code{@@smallbook} +command between the start-of-header and end-of-header lines, @TeX{} will +typeset a region in the ``small'' book format.@refill + +@ifinfo +The reason for the odd string of characters (@samp{%**}) is so that the +@code{texinfo-tex-region} command does not accidentally find +something that it should not when it is looking for the header.@refill + +The start-of-header line and the end-of-header line are Texinfo mode +variables that you can change.@refill +@end ifinfo + +@iftex +@xref{Start of Header}. +@end iftex + +@node Info Summary and Permissions, Titlepage & Copyright Page, Header, Beginning a File +@comment node-name, next, previous, up +@section Summary and Copying Permissions for Info + +The title page and the copyright page appear only in the printed copy of +the manual; therefore, the same information must be inserted in a +section that appears only in the Info file. This section usually +contains a brief description of the contents of the Info file, a +copyright notice, and copying permissions.@refill + +The copyright notice should read:@refill + +@example +Copyright @var{year} @var{copyright-owner} +@end example + +@noindent +and be put on a line by itself.@refill + +Standard text for the copyright permissions is contained in an appendix +to this manual; see @ref{ifinfo Permissions, , @samp{ifinfo} Copying +Permissions}, for the complete text.@refill + +The permissions text appears in an Info file @emph{before} the first +node. This mean that a reader does @emph{not} see this text when +reading the file using Info, except when using the advanced Info command +@kbd{g *}. + +@node Titlepage & Copyright Page, The Top Node, Info Summary and Permissions, Beginning a File +@comment node-name, next, previous, up +@section The Title and Copyright Pages + +A manual's name and author are usually printed on a title page. +Sometimes copyright information is printed on the title page as well; +more often, copyright information is printed on the back of the title +page. + +The title and copyright pages appear in the printed manual, but not in the +Info file. Because of this, it is possible to use several slightly +obscure @TeX{} typesetting commands that cannot be used in an Info file. +In addition, this part of the beginning of a Texinfo file contains the text +of the copying permissions that will appear in the printed manual.@refill + +@xref{Titlepage Permissions, , Titlepage Copying Permissions}, for the +standard text for the copyright permissions.@refill + +@menu +* titlepage:: Create a title for the printed document. +* titlefont center sp:: The @code{@@titlefont}, @code{@@center}, + and @code{@@sp} commands. +* title subtitle author:: The @code{@@title}, @code{@@subtitle}, + and @code{@@author} commands. +* Copyright & Permissions:: How to write the copyright notice and + include copying permissions. +* end titlepage:: Turn on page headings after the title and + copyright pages. +* headings on off:: An option for turning headings on and off + and double or single sided printing. +@end menu + +@node titlepage, titlefont center sp, Titlepage & Copyright Page, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection @code{@@titlepage} +@cindex Title page +@findex titlepage + +Start the material for the title page and following copyright page +with @code{@@titlepage} on a line by itself and end it with +@code{@@end titlepage} on a line by itself.@refill + +The @code{@@end titlepage} command starts a new page and turns on page +numbering. (@xref{Headings, , Page Headings}, for details about how to +generate page headings.) All the material that you want to +appear on unnumbered pages should be put between the +@code{@@titlepage} and @code{@@end titlepage} commands. By using the +@code{@@page} command you can force a page break within the region +delineated by the @code{@@titlepage} and @code{@@end titlepage} +commands and thereby create more than one unnumbered page. This is +how the copyright page is produced. (The @code{@@titlepage} command +might perhaps have been better named the +@code{@@titleandadditionalpages} command, but that would have been +rather long!)@refill + +@c !!! append refill to footnote when makeinfo can handle it. +When you write a manual about a computer program, you should write the +version of the program to which the manual applies on the title +page. If the manual changes more frequently than the program or is +independent of it, you should also include an edition +number@footnote{We have found that it is helpful to refer to versions +of manuals as `editions' and versions of programs as `versions'; +otherwise, we find we are liable to confuse each other in conversation +by referring to both the documentation and the software with the same +words.} for the manual. This helps readers keep track of which manual +is for which version of the program. (The `Top' node +should also contain this information; see @ref{makeinfo top, , +@code{@@top}}.)@refill + +Texinfo provides two main methods for creating a title page. One method +uses the @code{@@titlefont}, @code{@@sp}, and @code{@@center} commands +to generate a title page in which the words on the page are +centered.@refill + +The second method uses the @code{@@title}, @code{@@subtitle}, and +@code{@@author} commands to create a title page with black rules under +the title and author lines and the subtitle text set flush to the +right hand side of the page. With this method, you do not specify any +of the actual formatting of the title page. You specify the text +you want, and Texinfo does the formatting. You may use either +method.@refill + +@findex shorttitlepage +For extremely simple applications, Texinfo also provides a command +@code{@@shorttitlepage} which takes a single argument as the title. +The argument is typeset on a page by itself and followed by a blank +page. + + +@node titlefont center sp, title subtitle author, titlepage, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection @code{@@titlefont}, @code{@@center}, and @code{@@sp} +@findex titlefont +@findex center +@findex sp @r{(titlepage line spacing)} + +You can use the @code{@@titlefont}, @code{@@sp}, and @code{@@center} +commands to create a title page for a printed document. (This is the +first of the two methods for creating a title page in Texinfo.)@refill + +Use the @code{@@titlefont} command to select a large font suitable for +the title itself.@refill + +@need 700 +For example: + +@example +@@titlefont@{Texinfo@} +@end example + +Use the @code{@@center} command at the beginning of a line to center +the remaining text on that line. Thus,@refill + +@example +@@center @@titlefont@{Texinfo@} +@end example + +@noindent +centers the title, which in this example is ``Texinfo'' printed +in the title font.@refill + +Use the @code{@@sp} command to insert vertical space. For example:@refill + +@example +@@sp 2 +@end example + +@noindent +This inserts two blank lines on the printed page. (@xref{sp, , +@code{@@sp}}, for more information about the @code{@@sp} +command.)@refill + +A template for this method looks like this:@refill + +@example +@group +@@titlepage +@@sp 10 +@@center @@titlefont@{@var{name-of-manual-when-printed}@} +@@sp 2 +@@center @var{subtitle-if-any} +@@sp 2 +@@center @var{author} +@dots{} +@@end titlepage +@end group +@end example + +The spacing of the example fits an 8 1/2 by 11 inch manual.@refill + +@node title subtitle author, Copyright & Permissions, titlefont center sp, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection @code{@@title}, @code{@@subtitle}, and @code{@@author} +@findex title +@findex subtitle +@findex author + +You can use the @code{@@title}, @code{@@subtitle}, and @code{@@author} +commands to create a title page in which the vertical and horizontal +spacing is done for you automatically. This contrasts with the method +described in +the previous section, in which the @code{@@sp} command is needed to +adjust vertical spacing.@refill + +Write the @code{@@title}, @code{@@subtitle}, or @code{@@author} +commands at the beginning of a line followed by the title, subtitle, +or author.@refill + +The @code{@@title} command produces a line in which the title is set +flush to the left-hand side of the page in a larger than normal font. +The title is underlined with a black rule.@refill + +The @code{@@subtitle} command sets subtitles in a normal-sized font +flush to the right-hand side of the page.@refill + +The @code{@@author} command sets the names of the author or authors in +a middle-sized font flush to the left-hand side of the page on a line +near the bottom of the title page. The names are underlined with a +black rule that is thinner than the rule that underlines the title. +(The black rule only occurs if the @code{@@author} command line is +followed by an @code{@@page} command line.)@refill + +There are two ways to use the @code{@@author} command: you can write +the name or names on the remaining part of the line that starts with +an @code{@@author} command:@refill + +@example +@@author by Jane Smith and John Doe +@end example + +@noindent +or you can write the names one above each other by using two (or more) +@code{@@author} commands:@refill + +@example +@group +@@author Jane Smith +@@author John Doe +@end group +@end example + +@noindent +(Only the bottom name is underlined with a black rule.)@refill + +@need 950 +A template for this method looks like this:@refill + +@example +@group +@@titlepage +@@title @var{name-of-manual-when-printed} +@@subtitle @var{subtitle-if-any} +@@subtitle @var{second-subtitle} +@@author @var{author} +@@page +@dots{} +@@end titlepage +@end group +@end example + +@ifinfo +@noindent +Contrast this form with the form of a title page written using the +@code{@@sp}, @code{@@center}, and @code{@@titlefont} commands:@refill + +@example +@@titlepage +@@sp 10 +@@center @@titlefont@{Name of Manual When Printed@} +@@sp 2 +@@center Subtitle, If Any +@@sp 1 +@@center Second subtitle +@@sp 2 +@@center Author +@@page +@dots{} +@@end titlepage +@end example +@end ifinfo + +@node Copyright & Permissions, end titlepage, title subtitle author, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection Copyright Page and Permissions +@cindex Copyright page +@cindex Printed permissions +@cindex Permissions, printed + +By international treaty, the copyright notice for a book should be +either on the title page or on the back of the title page. The +copyright notice should include the year followed by the name of the +organization or person who owns the copyright.@refill + +When the copyright notice is on the back of the title page, that page +is customarily not numbered. Therefore, in Texinfo, the information +on the copyright page should be within @code{@@titlepage} and +@code{@@end titlepage} commands.@refill + +@findex vskip +@findex filll +@cindex Vertical whitespace (@samp{vskip}) +Use the @code{@@page} command to cause a page break. To push the +copyright notice and the other text on the copyright page towards the +bottom of the page, you can write a somewhat mysterious line after the +@code{@@page} command that reads like this:@refill + +@example +@@vskip 0pt plus 1filll +@end example + +@noindent +This is a @TeX{} command that is not supported by the Info formatting +commands. The @code{@@vskip} command inserts whitespace. The +@samp{0pt plus 1filll} means to put in zero points of mandatory whitespace, +and as much optional whitespace as needed to push the +following text to the bottom of the page. Note the use of three +@samp{l}s in the word @samp{filll}; this is the correct usage in +@TeX{}.@refill + +@findex copyright +In a printed manual, the @code{@@copyright@{@}} command generates a +@samp{c} inside a circle. (In Info, it generates @samp{(C)}.) The +copyright notice itself has the following legally defined sequence:@refill + +@example +Copyright @copyright{} @var{year} @var{copyright-owner} +@end example + +It is customary to put information on how to get a manual after the +copyright notice, followed by the copying permissions for the +manual.@refill + +Note that permissions must be given here as well as in the summary +segment within @code{@@ifinfo} and @code{@@end ifinfo} that +immediately follows the header since this text appears only in the +printed manual and the @samp{ifinfo} text appears only in the Info +file.@refill + +@xref{Sample Permissions}, for the standard text.@refill + +@node end titlepage, headings on off, Copyright & Permissions, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection Heading Generation +@findex end titlepage +@cindex Headings, page, begin to appear +@cindex Titlepage end starts headings +@cindex End titlepage starts headings + +An @code{@@end titlepage} command on a line by itself not only marks +the end of the title and copyright pages, but also causes @TeX{} to start +generating page headings and page numbers. + +To repeat what is said elsewhere, Texinfo has two standard page heading +formats, one for documents which are printed on one side of each sheet of paper +(single-sided printing), and the other for documents which are printed on both +sides of each sheet (double-sided printing). +(@xref{setchapternewpage, ,@code{@@setchapternewpage}}.) +You can specify these formats in different ways:@refill + +@itemize @bullet +@item +The conventional way is to write an @code{@@setchapternewpage} command +before the title page commands, and then have the @code{@@end +titlepage} command start generating page headings in the manner desired. +(@xref{setchapternewpage, , @code{@@setchapternewpage}}.)@refill + +@item +Alternatively, you can use the @code{@@headings} command to prevent page +headings from being generated or to start them for either single or +double-sided printing. (Write an @code{@@headings} command immediately +after the @code{@@end titlepage} command. @xref{headings on off, , The +@code{@@headings} Command}, for more information.)@refill + +@item +Or, you may specify your own page heading and footing format. +@xref{Headings, , Page Headings}, for detailed +information about page headings and footings.@refill +@end itemize + +Most documents are formatted with the standard single-sided or +double-sided format, using @code{@@setchapternewpage odd} for +double-sided printing and no @code{@@setchapternewpage} command for +single-sided printing.@refill + +@node headings on off, , end titlepage, Titlepage & Copyright Page +@comment node-name, next, previous, up +@subsection The @code{@@headings} Command +@findex headings + +The @code{@@headings} command is rarely used. It specifies what kind of +page headings and footings to print on each page. Usually, this is +controlled by the @code{@@setchapternewpage} command. You need the +@code{@@headings} command only if the @code{@@setchapternewpage} command +does not do what you want, or if you want to turn off pre-defined page +headings prior to defining your own. Write an @code{@@headings} command +immediately after the @code{@@end titlepage} command.@refill + +You can use @code{@@headings} as follows:@refill + +@table @code +@item @@headings off +Turn off printing of page headings.@refill + +@item @@headings single +Turn on page headings appropriate for single-sided printing. +@refill + +@item @@headings double +Turn on page headings appropriate for double-sided printing. The two +commands, @code{@@headings on} and @code{@@headings double}, are +synonymous.@refill + +@item @@headings singleafter +@itemx @@headings doubleafter +Turn on @code{single} or @code{double} headings, respectively, after the +current page is output. + +@item @@headings on +Turn on page headings: @code{single} if @samp{@@setchapternewpage +on}, @code{double} otherwise. +@end table + +For example, suppose you write @code{@@setchapternewpage off} before the +@code{@@titlepage} command to tell @TeX{} to start a new chapter on the +same page as the end of the last chapter. This command also causes +@TeX{} to typeset page headers for single-sided printing. To cause +@TeX{} to typeset for double sided printing, write @code{@@headings +double} after the @code{@@end titlepage} command. + +You can stop @TeX{} from generating any page headings at all by +writing @code{@@headings off} on a line of its own immediately after the +line containing the @code{@@end titlepage} command, like this:@refill + +@example +@@end titlepage +@@headings off +@end example + +@noindent +The @code{@@headings off} command overrides the @code{@@end titlepage} +command, which would otherwise cause @TeX{} to print page +headings.@refill + +You can also specify your own style of page heading and footing. +@xref{Headings, , Page Headings}, for more information.@refill + +@node The Top Node, Software Copying Permissions, Titlepage & Copyright Page, Beginning a File +@comment node-name, next, previous, up +@section The `Top' Node and Master Menu +@cindex @samp{@r{Top}} node +@cindex Master menu +@cindex Node, `Top' + +The `Top' node is the node from which you enter an Info file.@refill + +A `Top' node should contain a brief description of the Info file and an +extensive, master menu for the whole Info file. +This helps the reader understand what the Info file is +about. Also, you should write the version number of the program to +which the Info file applies; or, at least, the edition number.@refill + +The contents of the `Top' node should appear only in the Info file; none +of it should appear in printed output, so enclose it between +@code{@@ifinfo} and @code{@@end ifinfo} commands. (@TeX{} does not +print either an @code{@@node} line or a menu; they appear only in Info; +strictly speaking, you are not required to enclose these parts between +@code{@@ifinfo} and @code{@@end ifinfo}, but it is simplest to do so. +@xref{Conditionals, , Conditionally Visible Text}.)@refill + +@menu +* Title of Top Node:: Sketch what the file is about. +* Master Menu Parts:: A master menu has three or more parts. +@end menu + +@node Title of Top Node, Master Menu Parts, The Top Node, The Top Node +@ifinfo +@subheading `Top' Node Title +@end ifinfo + +Sometimes, you will want to place an @code{@@top} sectioning command +line containing the title of the document immediately after the +@code{@@node Top} line (@pxref{makeinfo top command, , The @code{@@top} +Sectioning Command}, for more information).@refill + +For example, the beginning of the Top node of this manual contains an +@code{@@top} sectioning command, a short description, and edition and +version information. It looks like this:@refill + +@example +@group +@dots{} +@@end titlepage + +@@ifinfo +@@node Top, Copying, , (dir) +@@top Texinfo + +Texinfo is a documentation system@dots{} +@end group + +@group +This is edition@dots{} +@dots{} +@@end ifinfo +@end group + +@group +@@menu +* Copying:: Texinfo is freely + redistributable. +* Overview:: What is Texinfo? +@dots{} +@end group +@@end menu +@end example + +In a `Top' node, the `Previous', and `Up' nodes usually refer to the top +level directory of the whole Info system, which is called @samp{(dir)}. +The `Next' node refers to the first node that follows the main or master +menu, which is usually the copying permissions, introduction, or first +chapter.@refill + +@node Master Menu Parts, , Title of Top Node, The Top Node +@subsection Parts of a Master Menu +@cindex Master menu parts +@cindex Parts of a master menu + +A @dfn{master menu} is a detailed main menu listing all the nodes in a +file. + +A master menu is enclosed in @code{@@menu} and @code{@@end menu} +commands and does not appear in the printed document.@refill + +Generally, a master menu is divided into parts.@refill + +@itemize @bullet +@item +The first part contains the major nodes in the Texinfo file: the nodes +for the chapters, chapter-like sections, and the appendices.@refill + +@item +The second part contains nodes for the indices.@refill + +@item +The third and subsequent parts contain a listing of the other, lower +level nodes, often ordered by chapter. This way, rather than go +through an intermediary menu, an inquirer can go directly to a +particular node when searching for specific information. These menu +items are not required; add them if you think they are a +convenience. If you do use them, put @code{@@detailmenu} before the +first one, and @code{@@end detailmenu} after the last; otherwise, +@code{makeinfo} will get confused. +@end itemize + +Each section in the menu can be introduced by a descriptive line. So +long as the line does not begin with an asterisk, it will not be +treated as a menu entry. (@xref{Writing a Menu}, for more +information.)@refill + +For example, the master menu for this manual looks like the following +(but has many more entries):@refill + +@example +@group +@@menu +* Copying:: Texinfo is freely + redistributable. +* Overview:: What is Texinfo? +* Texinfo Mode:: Special features in GNU Emacs. +@dots{} +@dots{} +@end group +@group +* Command and Variable Index:: + An entry for each @@-command. +* Concept Index:: An entry for each concept. +@end group + +@group +@@detailmenu + --- The Detailed Node Listing --- + +Overview of Texinfo + +* Info Files:: What is an Info file? +* Printed Manuals:: Characteristics of + a printed manual. +@dots{} +@dots{} +@end group + +@group +Using Texinfo Mode + +* Info on a Region:: Formatting part of a file + for Info. +@dots{} +@dots{} +@@end detailmenu +@@end menu +@end group +@end example + +@node Software Copying Permissions, , The Top Node, Beginning a File +@comment node-name, next, previous, up +@section Software Copying Permissions +@cindex Software copying permissions +@cindex Copying software +@cindex Distribution +@cindex License agreement + +If the Texinfo file has a section containing the ``General Public +License'' and the distribution information and a warranty disclaimer +for the software that is documented, this section usually follows the +`Top' node. The General Public License is very important to Project +GNU software. It ensures that you and others will continue to have a +right to use and share the software.@refill + +The copying and distribution information and the disclaimer are +followed by an introduction or else by the first chapter of the +manual.@refill + +@cindex Introduction, as part of file +Although an introduction is not a required part of a Texinfo file, it +is very helpful. Ideally, it should state clearly and concisely what +the file is about and who would be interested in reading it. In +general, an introduction would follow the licensing and distribution +information, although sometimes people put it earlier in the document. +Usually, an introduction is put in an @code{@@unnumbered} section. +(@xref{unnumbered & appendix, , The @code{@@unnumbered} and +@code{@@appendix} Commands}.)@refill + +@node Ending a File, Structuring, Beginning a File, Top +@comment node-name, next, previous, up +@chapter Ending a Texinfo File +@cindex Ending a Texinfo file +@cindex Texinfo file ending +@cindex File ending +@findex bye + +The end of a Texinfo file should include the commands that create +indices and generate detailed and summary tables of contents. +And it must include the @code{@@bye} command that marks the last line +processed by @TeX{}.@refill + +@need 700 +For example: + +@example +@@node Concept Index, , Variables Index, Top +@@c node-name, next, previous, up +@@unnumbered Concept Index + +@@printindex cp + +@@contents +@@bye +@end example + +@menu +* Printing Indices & Menus:: How to print an index in hardcopy and + generate index menus in Info. +* Contents:: How to create a table of contents. +* File End:: How to mark the end of a file. +@end menu + +@node Printing Indices & Menus, Contents, Ending a File, Ending a File +@comment node-name, next, previous, up +@section Index Menus and Printing an Index +@findex printindex +@cindex Printing an index +@cindex Indices, printing and menus +@cindex Generating menus with indices +@cindex Menus generated with indices + +To print an index means to include it as part of a manual or Info +file. This does not happen automatically just because you use +@code{@@cindex} or other index-entry generating commands in the +Texinfo file; those just cause the raw data for the index to be +accumulated. To generate an index, you must include the +@code{@@printindex} command at the place in the document where you +want the index to appear. Also, as part of the process of creating a +printed manual, you must run a program called @code{texindex} +(@pxref{Format/Print Hardcopy}) to sort the raw data to produce a sorted +index file. The sorted index file is what is actually used to +print the index.@refill + +Texinfo offers six different types of predefined index: the concept +index, the function index, the variables index, the keystroke index, the +program index, and the data type index (@pxref{Predefined Indices}). Each +index type has a two-letter name: @samp{cp}, @samp{fn}, @samp{vr}, +@samp{ky}, @samp{pg}, and @samp{tp}. You may merge indices, or put them +into separate sections (@pxref{Combining Indices}); or you may define +your own indices (@pxref{New Indices, , Defining New Indices}).@refill + +The @code{@@printindex} command takes a two-letter index name, reads +the corresponding sorted index file and formats it appropriately into +an index.@refill + +@ignore +The two-letter index names are: + +@table @samp +@item cp +concept index +@item fn +function index +@item vr +variable index +@item ky +key index +@item pg +program index +@item tp +data type index +@end table +@end ignore +The @code{@@printindex} command does not generate a chapter heading +for the index. Consequently, you should precede the +@code{@@printindex} command with a suitable section or chapter command +(usually @code{@@unnumbered}) to supply the chapter heading and put +the index into the table of contents. Precede the @code{@@unnumbered} +command with an @code{@@node} line.@refill + +@need 1200 +For example: + +@smallexample +@group +@@node Variable Index, Concept Index, Function Index, Top +@@comment node-name, next, previous, up +@@unnumbered Variable Index + +@@printindex vr +@end group + +@group +@@node Concept Index, , Variable Index, Top +@@comment node-name, next, previous, up +@@unnumbered Concept Index + +@@printindex cp +@end group + +@group +@@summarycontents +@@contents +@@bye +@end group +@end smallexample + +@noindent +(Readers often prefer that the concept index come last in a book, +since that makes it easiest to find.)@refill + +@ignore +@c TeX can do sorting, just not conveniently enough to handle sorting +@c Texinfo indexes. --karl, 5may97. +In @TeX{}, the @code{@@printindex} command needs a sorted index file +to work from. @TeX{} does not know how to do sorting; this is a +deficiency. @TeX{} writes output files of raw index data; use the +@code{texindex} program to convert these files to sorted index files. +(@xref{Format/Print Hardcopy}, for more information.)@refill +@end ignore + + +@node Contents, File End, Printing Indices & Menus, Ending a File +@comment node-name, next, previous, up +@section Generating a Table of Contents +@cindex Table of contents +@cindex Contents, Table of +@findex contents +@findex summarycontents +@findex shortcontents + +The @code{@@chapter}, @code{@@section}, and other structuring commands +supply the information to make up a table of contents, but they do not +cause an actual table to appear in the manual. To do this, you must +use the @code{@@contents} and @code{@@summarycontents} +commands:@refill + +@table @code +@item @@contents +Generate a table of contents in a printed manual, including all +chapters, sections, subsections, etc., as well as appendices and +unnumbered chapters. (Headings generated by the @code{@@heading} +series of commands do not appear in the table of contents.) The +@code{@@contents} command should be written on a line by +itself.@refill + +@item @@shortcontents +@itemx @@summarycontents +(@code{@@summarycontents} is a synonym for @code{@@shortcontents}; the +two commands are exactly the same.)@refill + +Generate a short or summary table of contents that lists only the +chapters (and appendices and unnumbered chapters). Omit sections, subsections +and subsubsections. Only a long manual needs a short table +of contents in addition to the full table of contents.@refill + +Write the @code{@@shortcontents} command on a line by itself right +@emph{before} the @code{@@contents} command.@refill +@end table + +The table of contents commands automatically generate a chapter-like +heading at the top of the first table of contents page. Write the table +of contents commands at the very end of a Texinfo file, just before the +@code{@@bye} command, following any index sections---anything in the +Texinfo file after the table of contents commands will be omitted from +the table of contents.@refill + +When you print a manual with a table of contents, the table of +contents are printed last and numbered with roman numerals. You need +to place those pages in their proper place, after the title page, +yourself. (This is the only collating you need to do for a printed +manual. The table of contents is printed last because it is generated +after the rest of the manual is typeset.)@refill + +@need 700 +Here is an example of where to write table of contents commands:@refill + +@example +@group +@var{indices}@dots{} +@@shortcontents +@@contents +@@bye +@end group +@end example + +Since an Info file uses menus instead of tables of contents, the Info +formatting commands ignore the @code{@@contents} and +@code{@@shortcontents} commands.@refill + +@node File End, , Contents, Ending a File +@comment node-name, next, previous, up +@section @code{@@bye} File Ending +@findex bye + +An @code{@@bye} command terminates @TeX{} or Info formatting. None of +the formatting commands see any of the file following @code{@@bye}. +The @code{@@bye} command should be on a line by itself.@refill + +If you wish, you may follow the @code{@@bye} line with notes. These notes +will not be formatted and will not appear in either Info or a printed +manual; it is as if text after @code{@@bye} were within @code{@@ignore} +@dots{} @code{@@end ignore}. Also, you may follow the @code{@@bye} line +with a local variables list. @xref{Compile-Command, , Using Local +Variables and the Compile Command}, for more information.@refill + +@node Structuring, Nodes, Ending a File, Top +@comment node-name, next, previous, up +@chapter Chapter Structuring +@cindex Chapter structuring +@cindex Structuring of chapters + +The @dfn{chapter structuring} commands divide a document into a hierarchy of +chapters, sections, subsections, and subsubsections. These commands +generate large headings; they also provide information for the table +of contents of a printed manual (@pxref{Contents, , Generating a Table +of Contents}).@refill + +The chapter structuring commands do not create an Info node structure, +so normally you should put an @code{@@node} command immediately before +each chapter structuring command (@pxref{Nodes}). The only time you +are likely to use the chapter structuring commands without using the +node structuring commands is if you are writing a document that +contains no cross references and will never be transformed into Info +format.@refill + +It is unlikely that you will ever write a Texinfo file that is +intended only as an Info file and not as a printable document. If you +do, you might still use chapter structuring commands to create a +heading at the top of each node---but you don't need to.@refill + +@menu +* Tree Structuring:: A manual is like an upside down tree @dots{} +* Structuring Command Types:: How to divide a manual into parts. +* makeinfo top:: The @code{@@top} command, part of the `Top' node. +* chapter:: +* unnumbered & appendix:: +* majorheading & chapheading:: +* section:: +* unnumberedsec appendixsec heading:: +* subsection:: +* unnumberedsubsec appendixsubsec subheading:: +* subsubsection:: Commands for the lowest level sections. +* Raise/lower sections:: How to change commands' hierarchical level. +@end menu + +@node Tree Structuring, Structuring Command Types, Structuring, Structuring +@comment node-name, next, previous, up +@section Tree Structure of Sections +@cindex Tree structuring + +A Texinfo file is usually structured like a book with chapters, +sections, subsections, and the like. This structure can be visualized +as a tree (or rather as an upside-down tree) with the root at the top +and the levels corresponding to chapters, sections, subsection, and +subsubsections.@refill + +Here is a diagram that shows a Texinfo file with three chapters, +each of which has two sections.@refill + +@example +@group + Top + | + ------------------------------------- + | | | + Chapter 1 Chapter 2 Chapter 3 + | | | + -------- -------- -------- + | | | | | | + Section Section Section Section Section Section + 1.1 1.2 2.1 2.2 3.1 3.2 + +@end group +@end example + +In a Texinfo file that has this structure, the beginning of Chapter 2 +looks like this:@refill + +@example +@group +@@node Chapter 2, Chapter 3, Chapter 1, top +@@chapter Chapter 2 +@end group +@end example + +The chapter structuring commands are described in the sections that +follow; the @code{@@node} and @code{@@menu} commands are described in +following chapters. (@xref{Nodes}, and see @ref{Menus}.)@refill + +@node Structuring Command Types, makeinfo top, Tree Structuring, Structuring +@comment node-name, next, previous, up +@section Types of Structuring Commands + +The chapter structuring commands fall into four groups or series, each +of which contains structuring commands corresponding to the +hierarchical levels of chapters, sections, subsections, and +subsubsections.@refill + +The four groups are the @code{@@chapter} series, the +@code{@@unnumbered} series, the @code{@@appendix} series, and the +@code{@@heading} series.@refill + +Each command produces titles that have a different appearance on the +printed page or Info file; only some of the commands produce +titles that are listed in the table of contents of a printed book or +manual.@refill + +@itemize @bullet +@item +The @code{@@chapter} and @code{@@appendix} series of commands produce +numbered or lettered entries both in the body of a printed work and in +its table of contents.@refill + +@item +The @code{@@unnumbered} series of commands produce unnumbered entries +both in the body of a printed work and in its table of contents. The +@code{@@top} command, which has a special use, is a member of this +series (@pxref{makeinfo top, , @code{@@top}}).@refill + +@item +The @code{@@heading} series of commands produce unnumbered headings +that do not appear in a table of contents. The heading commands never +start a new page.@refill + +@item +The @code{@@majorheading} command produces results similar to using +the @code{@@chapheading} command but generates a larger vertical +whitespace before the heading.@refill + +@item +When an @code{@@setchapternewpage} command says to do so, the +@code{@@chapter}, @code{@@unnumbered}, and @code{@@appendix} commands +start new pages in the printed manual; the @code{@@heading} commands +do not.@refill +@end itemize + +@need 1000 +Here are the four groups of chapter structuring commands:@refill + +@c Slightly different formatting for regular sized books and smallbooks. +@ifset smallbook +@sp 1 +@tex +{\let\rm=\indrm \let\tt=\indtt +\halign{\hskip\itemindent#\hfil& \hskip.5em#\hfil& \hskip.5em#\hfil& +\hskip.5em#\hfil\cr + +& & & \rm No new pages\cr +\rm Numbered& \rm Unnumbered& \rm Lettered and numbered& \rm Unnumbered\cr +\rm In contents& \rm In contents& \rm In contents& \rm Not in contents\cr + +& & & \cr + & \tt @@top& & \tt @@majorheading\cr +\tt @@chapter& \tt @@unnumbered& \tt @@appendix& \tt @@chapheading\cr +\tt @@section& \tt @@unnumberedsec& \tt @@appendixsec& \tt @@heading\cr +\tt @@subsection&\tt @@unnumberedsubsec&\tt @@appendixsubsec& +\tt @@subheading\cr +\tt @@subsubsection& \tt @@unnumberedsubsubsec& \tt @@appendixsubsubsec& +\tt @@subsubheading\cr}} +@end tex +@end ifset +@ifclear smallbook +@sp 1 +@tex +\vbox{ +\halign{\hskip\itemindent\hskip.5em#\hfil& \hskip.5em#\hfil& +\hskip.5em#\hfil& \hskip.5em #\hfil\cr + +& & & \cr +& & & \rm No new pages\cr +\rm Numbered& \rm Unnumbered& \rm Lettered and numbered& \rm Unnumbered\cr +\rm In contents& \rm In contents& \rm In contents& \rm Not in contents\cr + +& & & \cr + & \tt @@top& & \tt @@majorheading\cr +\tt @@chapter& \tt @@unnumbered& \tt @@appendix& \tt @@chapheading\cr +\tt @@section& \tt @@unnumberedsec& \tt @@appendixsec& \tt @@heading\cr +\tt @@subsection&\tt @@unnumberedsubsec&\tt @@appendixsubsec& +\tt @@subheading\cr +\tt @@subsubsection& \tt @@unnumberedsubsubsec& \tt @@appendixsubsubsec& +\tt @@subsubheading\cr}} +@end tex +@end ifclear +@ifinfo +@example +@group + @r{No new pages} +@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} +@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} + + @@top @@majorheading +@@chapter @@unnumbered @@appendix @@chapheading +@@section @@unnumberedsec @@appendixsec @@heading +@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading +@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading +@end group +@end example +@end ifinfo + +@c Cannot line up columns properly inside of an example because of roman +@c proportional fonts. +@ignore +@ifset smallbook +@iftex +@smallexample +@group + @r{No new pages} +@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} +@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} + + @@top @@majorheading +@@chapter @@unnumbered @@appendix @@chapheading +@@section @@unnumberedsec @@appendixsec @@heading +@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading +@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading +@end group +@end smallexample +@end iftex +@end ifset +@ifclear smallbook +@iftex +@smallexample +@group + @r{No new pages} +@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} +@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} + + @@top @@majorheading +@@chapter @@unnumbered @@appendix @@chapheading +@@section @@unnumberedsec @@appendixsec @@heading +@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading +@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading +@end group +@end smallexample +@end iftex +@end ignore + +@node makeinfo top, chapter, Structuring Command Types, Structuring +@comment node-name, next, previous, up +@section @code{@@top} + +The @code{@@top} command is a special sectioning command that you use +only after an @samp{@@node Top} line at the beginning of a Texinfo file. +The @code{@@top} command tells the @code{makeinfo} formatter +which node is the `Top' +node. It has the same typesetting effect as @code{@@unnumbered} +(@pxref{unnumbered & appendix, , @code{@@unnumbered}, @code{@@appendix}}). +For detailed information, see +@ref{makeinfo top command, , The @code{@@top} Command}.@refill + +@node chapter, unnumbered & appendix, makeinfo top, Structuring +@comment node-name, next, previous, up +@section @code{@@chapter} +@findex chapter + +@code{@@chapter} identifies a chapter in the document. Write the +command at the beginning of a line and follow it on the same line by +the title of the chapter.@refill + +For example, this chapter in this manual is entitled ``Chapter +Structuring''; the @code{@@chapter} line looks like this:@refill + +@example +@@chapter Chapter Structuring +@end example + +In @TeX{}, the @code{@@chapter} command creates a chapter in the +document, specifying the chapter title. The chapter is numbered +automatically.@refill + +In Info, the @code{@@chapter} command causes the title to appear on a +line by itself, with a line of asterisks inserted underneath. Thus, +in Info, the above example produces the following output:@refill + +@example +Chapter Structuring +******************* +@end example + +@findex centerchap +Texinfo also provides a command @code{@@centerchap}, which is analogous +to @code{@@unnumbered}, but centers its argument in the printed output. +This kind of stylistic choice is not usually offered by Texinfo. +@c but the Hacker's Dictionary wanted it ... + + +@node unnumbered & appendix, majorheading & chapheading, chapter, Structuring +@comment node-name, next, previous, up +@section @code{@@unnumbered}, @code{@@appendix} +@findex unnumbered +@findex appendix + +Use the @code{@@unnumbered} command to create a chapter that appears +in a printed manual without chapter numbers of any kind. Use the +@code{@@appendix} command to create an appendix in a printed manual +that is labelled by letter instead of by number.@refill + +For Info file output, the @code{@@unnumbered} and @code{@@appendix} +commands are equivalent to @code{@@chapter}: the title is printed on a +line by itself with a line of asterisks underneath. (@xref{chapter, , +@code{@@chapter}}.)@refill + +To create an appendix or an unnumbered chapter, write an +@code{@@appendix} or @code{@@unnumbered} command at the beginning of a +line and follow it on the same line by the title, as you would if you +were creating a chapter.@refill + + +@node majorheading & chapheading, section, unnumbered & appendix, Structuring +@section @code{@@majorheading}, @code{@@chapheading} +@findex majorheading +@findex chapheading + +The @code{@@majorheading} and @code{@@chapheading} commands put +chapter-like headings in the body of a document.@refill + +However, neither command causes @TeX{} to produce a numbered heading +or an entry in the table of contents; and neither command causes +@TeX{} to start a new page in a printed manual.@refill + +In @TeX{}, an @code{@@majorheading} command generates a larger vertical +whitespace before the heading than an @code{@@chapheading} command but +is otherwise the same.@refill + +In Info, +the @code{@@majorheading} and +@code{@@chapheading} commands are equivalent to +@code{@@chapter}: the title is printed on a line by itself with a line +of asterisks underneath. (@xref{chapter, , @code{@@chapter}}.)@refill + +@node section, unnumberedsec appendixsec heading, majorheading & chapheading, Structuring +@comment node-name, next, previous, up +@section @code{@@section} +@findex section + +In a printed manual, an @code{@@section} command identifies a +numbered section within a chapter. The section title appears in the +table of contents. In Info, an @code{@@section} command provides a +title for a segment of text, underlined with @samp{=}.@refill + +This section is headed with an @code{@@section} command and looks like +this in the Texinfo file:@refill + +@example +@@section @@code@{@@@@section@} +@end example + +To create a section, write the @code{@@section} command at the +beginning of a line and follow it on the same line by the section +title.@refill + +Thus, + +@example +@@section This is a section +@end example + +@noindent +produces + +@example +@group +This is a section +================= +@end group +@end example + +@noindent +in Info. + +@node unnumberedsec appendixsec heading, subsection, section, Structuring +@comment node-name, next, previous, up +@section @code{@@unnumberedsec}, @code{@@appendixsec}, @code{@@heading} +@findex unnumberedsec +@findex appendixsec +@findex heading + +The @code{@@unnumberedsec}, @code{@@appendixsec}, and @code{@@heading} +commands are, respectively, the unnumbered, appendix-like, and +heading-like equivalents of the @code{@@section} command. +(@xref{section, , @code{@@section}}.)@refill + +@table @code +@item @@unnumberedsec +The @code{@@unnumberedsec} command may be used within an +unnumbered chapter or within a regular chapter or appendix to +provide an unnumbered section.@refill + +@item @@appendixsec +@itemx @@appendixsection +@code{@@appendixsection} is a longer spelling of the +@code{@@appendixsec} command; the two are synonymous.@refill +@findex appendixsection + +Conventionally, the @code{@@appendixsec} or @code{@@appendixsection} +command is used only within appendices.@refill + +@item @@heading +You may use the @code{@@heading} command anywhere you wish for a +section-style heading that will not appear in the table of contents.@refill +@end table + +@node subsection, unnumberedsubsec appendixsubsec subheading, unnumberedsec appendixsec heading, Structuring +@comment node-name, next, previous, up +@section The @code{@@subsection} Command +@findex subsection + +Subsections are to sections as sections are to chapters. +(@xref{section, , @code{@@section}}.) In Info, subsection titles are +underlined with @samp{-}. For example,@refill + +@example +@@subsection This is a subsection +@end example + +@noindent +produces + +@example +@group +This is a subsection +-------------------- +@end group +@end example + +In a printed manual, subsections are listed in the table of contents +and are numbered three levels deep.@refill + +@node unnumberedsubsec appendixsubsec subheading, subsubsection, subsection, Structuring +@comment node-name, next, previous, up +@section The @code{@@subsection}-like Commands +@cindex Subsection-like commands +@findex unnumberedsubsec +@findex appendixsubsec +@findex subheading + +The @code{@@unnumberedsubsec}, @code{@@appendixsubsec}, and +@code{@@subheading} commands are, respectively, the unnumbered, +appendix-like, and heading-like equivalents of the @code{@@subsection} +command. (@xref{subsection, , @code{@@subsection}}.)@refill + +In Info, the @code{@@subsection}-like commands generate a title +underlined with hyphens. In a printed manual, an @code{@@subheading} +command produces a heading like that of a subsection except that it is +not numbered and does not appear in the table of contents. Similarly, +an @code{@@unnumberedsubsec} command produces an unnumbered heading like +that of a subsection and an @code{@@appendixsubsec} command produces a +subsection-like heading labelled with a letter and numbers; both of +these commands produce headings that appear in the table of +contents.@refill + +@node subsubsection, Raise/lower sections, unnumberedsubsec appendixsubsec subheading, Structuring +@comment node-name, next, previous, up +@section The `subsub' Commands +@cindex Subsub commands +@findex subsubsection +@findex unnumberedsubsubsec +@findex appendixsubsubsec +@findex subsubheading + +The fourth and lowest level sectioning commands in Texinfo are the +`subsub' commands. They are:@refill + +@table @code +@item @@subsubsection +Subsubsections are to subsections as subsections are to sections. +(@xref{subsection, , @code{@@subsection}}.) In a printed manual, +subsubsection titles appear in the table of contents and are numbered +four levels deep.@refill + +@item @@unnumberedsubsubsec +Unnumbered subsubsection titles appear in the table of contents of a +printed manual, but lack numbers. Otherwise, unnumbered +subsubsections are the same as subsubsections. In Info, unnumbered +subsubsections look exactly like ordinary subsubsections.@refill + +@item @@appendixsubsubsec +Conventionally, appendix commands are used only for appendices and are +lettered and numbered appropriately in a printed manual. They also +appear in the table of contents. In Info, appendix subsubsections look +exactly like ordinary subsubsections.@refill + +@item @@subsubheading +The @code{@@subsubheading} command may be used anywhere that you need +a small heading that will not appear in the table of contents. In +Info, subsubheadings look exactly like ordinary subsubsection +headings.@refill +@end table + +In Info, `subsub' titles are underlined with periods. +For example,@refill + +@example +@@subsubsection This is a subsubsection +@end example + +@noindent +produces + +@example +@group +This is a subsubsection +....................... +@end group +@end example + +@node Raise/lower sections, , subsubsection, Structuring +@comment node-name, next, previous, up +@section @code{@@raisesections} and @code{@@lowersections} +@findex raisesections +@findex lowersections +@cindex Raising and lowering sections +@cindex Sections, raising and lowering + +The @code{@@raisesections} and @code{@@lowersections} commands raise and +lower the hierarchical level of chapters, sections, subsections and the +like. The @code{@@raisesections} command changes sections to chapters, +subsections to sections, and so on. The @code{@@lowersections} command +changes chapters to sections, sections to subsections, and so on. + +@cindex Include files, and section levels +An @code{@@lowersections} command is useful if you wish to include text +that is written as an outer or standalone Texinfo file in another +Texinfo file as an inner, included file. If you write the command at +the beginning of the file, all your @code{@@chapter} commands are +formatted as if they were @code{@@section} commands, all your +@code{@@section} command are formatted as if they were +@code{@@subsection} commands, and so on. + +@need 1000 +@code{@@raisesections} raises a command one level in the chapter +structuring hierarchy:@refill + +@example +@group + @r{Change} @r{To} + +@@subsection @@section, +@@section @@chapter, +@@heading @@chapheading, + @r{etc.} +@end group +@end example + +@need 1000 +@code{@@lowersections} lowers a command one level in the chapter +structuring hierarchy:@refill + +@example +@group + @r{Change} @r{To} + +@@chapter @@section, +@@subsection @@subsubsection, +@@heading @@subheading, + @r{etc.} +@end group +@end example + +An @code{@@raisesections} or @code{@@lowersections} command changes only +those structuring commands that follow the command in the Texinfo file. +Write an @code{@@raisesections} or @code{@@lowersections} command on a +line of its own. + +An @code{@@lowersections} command cancels an @code{@@raisesections} +command, and vice versa. Typically, the commands are used like this: + +@example +@@lowersections +@@include somefile.texi +@@raisesections +@end example + +Without the @code{@@raisesections}, all the subsequent sections in your +document will be lowered. + +Repeated use of the commands continue to raise or lower the hierarchical +level a step at a time. + +An attempt to raise above `chapters' reproduces chapter commands; an +attempt to lower below `subsubsections' reproduces subsubsection +commands. + +@node Nodes, Menus, Structuring, Top +@comment node-name, next, previous, up +@chapter Nodes + +@dfn{Nodes} are the primary segments of a Texinfo file. They do not +themselves impose a hierarchic or any other kind of structure on a file. +Nodes contain @dfn{node pointers} that name other nodes, and can contain +@dfn{menus} which are lists of nodes. In Info, the movement commands +can carry you to a pointed-to node or to a node listed in a menu. Node +pointers and menus provide structure for Info files just as chapters, +sections, subsections, and the like, provide structure for printed +books.@refill + +@menu +* Two Paths:: Different commands to structure + Info output and printed output. +* Node Menu Illustration:: A diagram, and sample nodes and menus. +* node:: How to write a node, in detail. +* makeinfo Pointer Creation:: How to create node pointers with @code{makeinfo}. +@end menu + +@node Two Paths, Node Menu Illustration, Nodes, Nodes +@ifinfo +@heading Two Paths +@end ifinfo + +The node and menu commands and the chapter structuring commands are +independent of each other: + +@itemize @bullet +@item +In Info, node and menu commands provide structure. The chapter +structuring commands generate headings with different kinds of +underlining---asterisks for chapters, hyphens for sections, and so on; +they do nothing else.@refill + +@item +In @TeX{}, the chapter structuring commands generate chapter and section +numbers and tables of contents. The node and menu commands provide +information for cross references; they do nothing else.@refill +@end itemize + +You can use node pointers and menus to structure an Info file any way +you want; and you can write a Texinfo file so that its Info output has a +different structure than its printed output. However, most Texinfo +files are written such that the structure for the Info output +corresponds to the structure for the printed output. It is not +convenient to do otherwise.@refill + +Generally, printed output is structured in a tree-like hierarchy in +which the chapters are the major limbs from which the sections branch +out. Similarly, node pointers and menus are organized to create a +matching structure in the Info output.@refill + +@node Node Menu Illustration, node, Two Paths, Nodes +@comment node-name, next, previous, up +@section Node and Menu Illustration + +Here is a copy of the diagram shown earlier that illustrates a Texinfo +file with three chapters, each of which contains two sections.@refill + +Note that the ``root'' is at the top of the diagram and the ``leaves'' +are at the bottom. This is how such a diagram is drawn conventionally; +it illustrates an upside-down tree. For this reason, the root node is +called the `Top' node, and `Up' node pointers carry you closer to the +root.@refill + +@example +@group + Top + | + ------------------------------------- + | | | + Chapter 1 Chapter 2 Chapter 3 + | | | + -------- -------- -------- + | | | | | | + Section Section Section Section Section Section + 1.1 1.2 2.1 2.2 3.1 3.2 + +@end group +@end example + +Write the beginning of the node for Chapter 2 like this:@refill + +@example +@group +@@node Chapter 2, Chapter 3, Chapter 1, top +@@comment node-name, next, previous, up +@end group +@end example + +@noindent +This @code{@@node} line says that the name of this node is ``Chapter 2'', the +name of the `Next' node is ``Chapter 3'', the name of the `Previous' +node is ``Chapter 1'', and the name of the `Up' node is ``Top''. + +@quotation +@strong{Please Note:} `Next' refers to the next node at the same +hierarchical level in the manual, not necessarily to the next node +within the Texinfo file. In the Texinfo file, the subsequent node may +be at a lower level---a section-level node may follow a chapter-level +node, and a subsection-level node may follow a section-level node. +`Next' and `Previous' refer to nodes at the @emph{same} hierarchical +level. (The `Top' node contains the exception to this rule. Since the +`Top' node is the only node at that level, `Next' refers to the first +following node, which is almost always a chapter or chapter-level +node.)@refill +@end quotation + +To go to Sections 2.1 and 2.2 using Info, you need a menu inside Chapter +2. (@xref{Menus}.) You would write the menu just +before the beginning of Section 2.1, like this:@refill + +@example +@group + @@menu + * Sect. 2.1:: Description of this section. + * Sect. 2.2:: + @@end menu +@end group +@end example + +Write the node for Sect. 2.1 like this:@refill + +@example +@group + @@node Sect. 2.1, Sect. 2.2, Chapter 2, Chapter 2 + @@comment node-name, next, previous, up +@end group +@end example + +In Info format, the `Next' and `Previous' pointers of a node usually +lead to other nodes at the same level---from chapter to chapter or from +section to section (sometimes, as shown, the `Previous' pointer points +up); an `Up' pointer usually leads to a node at the level above (closer +to the `Top' node); and a `Menu' leads to nodes at a level below (closer +to `leaves'). (A cross reference can point to a node at any level; +see @ref{Cross References}.)@refill + +Usually, an @code{@@node} command and a chapter structuring command are +used in sequence, along with indexing commands. (You may follow the +@code{@@node} line with a comment line that reminds you which pointer is +which.)@refill + +Here is the beginning of the chapter in this manual called ``Ending a +Texinfo File''. This shows an @code{@@node} line followed by a comment +line, an @code{@@chapter} line, and then by indexing lines.@refill + +@example +@group +@@node Ending a File, Structuring, Beginning a File, Top +@@comment node-name, next, previous, up +@@chapter Ending a Texinfo File +@@cindex Ending a Texinfo file +@@cindex Texinfo file ending +@@cindex File ending +@end group +@end example + +@node node, makeinfo Pointer Creation, Node Menu Illustration, Nodes +@comment node-name, next, previous, up +@section The @code{@@node} Command + +@cindex Node, defined +A @dfn{node} is a segment of text that begins at an @code{@@node} +command and continues until the next @code{@@node} command. The +definition of node is different from that for chapter or section. A +chapter may contain sections and a section may contain subsections; +but a node cannot contain subnodes; the text of a node continues only +until the next @code{@@node} command in the file. A node usually +contains only one chapter structuring command, the one that follows +the @code{@@node} line. On the other hand, in printed output nodes +are used only for cross references, so a chapter or section may +contain any number of nodes. Indeed, a chapter usually contains +several nodes, one for each section, subsection, and +subsubsection.@refill + +To create a node, write an @code{@@node} command at the beginning of a +line, and follow it with four arguments, separated by commas, on the +rest of the same line. These arguments are the name of the node, and +the names of the `Next', `Previous', and `Up' pointers, in that order. +You may insert spaces before each pointer if you wish; the spaces are +ignored. You must write the name of the node, and the names of the +`Next', `Previous', and `Up' pointers, all on the same line. Otherwise, +the formatters fail. (@inforef{Top, info, info}, for more information +about nodes in Info.)@refill + +Usually, you write one of the chapter-structuring command lines +immediately after an @code{@@node} line---for example, an +@code{@@section} or @code{@@subsection} line. (@xref{Structuring +Command Types, , Types of Structuring Commands}.)@refill + +@quotation +@strong{Please note:} The GNU Emacs Texinfo mode updating commands work +only with Texinfo files in which @code{@@node} lines are followed by chapter +structuring lines. @xref{Updating Requirements}.@refill +@end quotation + +@TeX{} uses @code{@@node} lines to identify the names to use for cross +references. For this reason, you must write @code{@@node} lines in a +Texinfo file that you intend to format for printing, even if you do not +intend to format it for Info. (Cross references, such as the one at the +end of this sentence, are made with @code{@@xref} and its related +commands; see @ref{Cross References}.)@refill + +@menu +* Node Names:: How to choose node and pointer names. +* Writing a Node:: How to write an @code{@@node} line. +* Node Line Tips:: Keep names short. +* Node Line Requirements:: Keep names unique, without @@-commands. +* First Node:: How to write a `Top' node. +* makeinfo top command:: How to use the @code{@@top} command. +* Top Node Summary:: Write a brief description for readers. +@end menu + +@node Node Names, Writing a Node, node, node +@ifinfo +@subheading Choosing Node and Pointer Names +@end ifinfo + +The name of a node identifies the node. The pointers enable +you to reach other nodes and consist of the names of those nodes.@refill + +Normally, a node's `Up' pointer contains the name of the node whose menu +mentions that node. The node's `Next' pointer contains the name of the +node that follows that node in that menu and its `Previous' pointer +contains the name of the node that precedes it in that menu. When a +node's `Previous' node is the same as its `Up' node, both node pointers +name the same node.@refill + +Usually, the first node of a Texinfo file is the `Top' node, and its +`Up' and `Previous' pointers point to the @file{dir} file, which +contains the main menu for all of Info.@refill + +The `Top' node itself contains the main or master menu for the manual. +Also, it is helpful to include a brief description of the manual in the +`Top' node. @xref{First Node}, for information on how to write the +first node of a Texinfo file.@refill + +@node Writing a Node, Node Line Tips, Node Names, node +@comment node-name, next, previous, up +@subsection How to Write an @code{@@node} Line +@cindex Writing an @code{@@node} line +@cindex @code{@@node} line writing +@cindex Node line writing + +The easiest way to write an @code{@@node} line is to write @code{@@node} +at the beginning of a line and then the name of the node, like +this:@refill + +@example +@@node @var{node-name} +@end example + +If you are using GNU Emacs, you can use the update node commands +provided by Texinfo mode to insert the names of the pointers; or you +can leave the pointers out of the Texinfo file and let @code{makeinfo} +insert node pointers into the Info file it creates. (@xref{Texinfo +Mode}, and @ref{makeinfo Pointer Creation}.)@refill + +Alternatively, you can insert the `Next', `Previous', and `Up' +pointers yourself. If you do this, you may find it helpful to use the +Texinfo mode keyboard command @kbd{C-c C-c n}. This command inserts +@samp{@@node} and a comment line listing the names of the pointers in +their proper order. The comment line helps you keep track of which +arguments are for which pointers. This comment line is especially useful +if you are not familiar with Texinfo.@refill + +The template for a node line with `Next', `Previous', and `Up' pointers +looks like this:@refill + +@example +@@node @var{node-name}, @var{next}, @var{previous}, @var{up} +@end example + +If you wish, you can ignore @code{@@node} lines altogether in your first +draft and then use the @code{texinfo-insert-node-lines} command to +create @code{@@node} lines for you. However, we do not +recommend this practice. It is better to name the node itself +at the same time that you +write a segment so you can easily make cross references. A large number +of cross references are an especially important feature of a good Info +file.@refill + +After you have inserted an @code{@@node} line, you should immediately +write an @@-command for the chapter or section and insert its name. +Next (and this is important!), put in several index entries. Usually, +you will find at least two and often as many as four or five ways of +referring to the node in the index. Use them all. This will make it +much easier for people to find the node.@refill + +@node Node Line Tips, Node Line Requirements, Writing a Node, node +@comment node-name, next, previous, up +@subsection @code{@@node} Line Tips + +Here are three suggestions: + +@itemize @bullet +@item +Try to pick node names that are informative but short.@refill + +In the Info file, the file name, node name, and pointer names are all +inserted on one line, which may run into the right edge of the window. +(This does not cause a problem with Info, but is ugly.)@refill + +@item +Try to pick node names that differ from each other near the beginnings +of their names. This way, it is easy to use automatic name completion in +Info.@refill + +@item +By convention, node names are capitalized just as they would be for +section or chapter titles---initial and significant words are +capitalized; others are not.@refill +@end itemize + +@node Node Line Requirements, First Node, Node Line Tips, node +@comment node-name, next, previous, up +@subsection @code{@@node} Line Requirements + +@cindex Node line requirements +Here are several requirements for @code{@@node} lines: + +@itemize @bullet +@cindex Unique nodename requirement +@cindex Nodename must be unique +@item +All the node names for a single Info file must be unique.@refill + +Duplicates confuse the Info movement commands. This means, for +example, that if you end every chapter with a summary, you must name +each summary node differently. You cannot just call each one +``Summary''. You may, however, duplicate the titles of chapters, sections, +and the like. Thus you can end each chapter in a book with a section +called ``Summary'', so long as the node names for those sections are all +different.@refill + +@item +A pointer name must be the name of a node.@refill + +The node to which a pointer points may come before or after the +node containing the pointer.@refill + +@cindex @@-command in nodename +@cindex Nodename, cannot contain +@item +You cannot use any of the Texinfo @@-commands in a node name; +@w{@@-commands} confuse Info.@refill + +@need 750 +Thus, the beginning of the section called @code{@@chapter} looks like +this:@refill + +@smallexample +@group +@@node chapter, unnumbered & appendix, makeinfo top, Structuring +@@comment node-name, next, previous, up +@@section @@code@{@@@@chapter@} +@@findex chapter +@end group +@end smallexample + +@cindex Comma in nodename +@cindex Apostrophe in nodename +@item +You cannot use commas or apostrophes within a node name; these +confuse @TeX{} or the Info formatters.@refill + +@need 700 +For example, the following is a section title: + +@smallexample +@@code@{@@@@unnumberedsec@}, @@code@{@@@@appendixsec@}, @@code@{@@@@heading@} +@end smallexample + +@noindent +The corresponding node name is: + +@smallexample +unnumberedsec appendixsec heading +@end smallexample + +@cindex Case in nodename +@item +Case is significant. +@end itemize + + +@node First Node, makeinfo top command, Node Line Requirements, node +@comment node-name, next, previous, up +@subsection The First Node +@cindex Top node is first +@cindex First node + +The first node of a Texinfo file is the @dfn{Top} node, except in an +included file (@pxref{Include Files}). The Top node contains the main +or master menu for the document, and a short summary of the document +(@pxref{Top Node Summary}). + +@cindex Up node of Top node +@cindex (dir) as Up node of Top node +The Top node (which must be named @samp{top} or @samp{Top}) should have +as its `Up' node the name of a node in another file, where there is a +menu that leads to this file. Specify the file name in parentheses. If +the file is to be installed directly in the Info directory file, use +@samp{(dir)} as the parent of the Top node; this is short for +@samp{(dir)top}, and specifies the Top node in the @file{dir} file, +which contains the main menu for the Info system as a whole. For +example, the @code{@@node Top} line of this manual looks like this: + +@example +@@node Top, Copying, , (dir) +@end example + +@noindent +(You can use the Texinfo updating commands or the @code{makeinfo} +utility to insert these pointers automatically.) + +@cindex Previous node of Top node +Do not define the `Previous' node of the Top node to be @samp{(dir)}, as +it causes confusing behavior for users: if you are in the Top node and +hits @key{DEL} to go backwards, you wind up in the middle of the +some other entry in the @file{dir} file, which has nothing to do with +what you were reading. + +@xref{Install an Info File}, for more information about installing +an Info file in the @file{info} directory. + + +@node makeinfo top command, Top Node Summary, First Node, node +@comment node-name, next, previous, up +@subsection The @code{@@top} Sectioning Command +@findex top @r{(@@-command)} + +A special sectioning command, @code{@@top}, has been created for use +with the @code{@@node Top} line. The @code{@@top} sectioning command tells +@code{makeinfo} that it marks the `Top' node in the file. It provides +the information that @code{makeinfo} needs to insert node +pointers automatically. Write the @code{@@top} command at the +beginning of the line immediately following the @code{@@node Top} +line. Write the title on the remaining part of the same line as the +@code{@@top} command.@refill + +In Info, the @code{@@top} sectioning command causes the title to appear on a +line by itself, with a line of asterisks inserted underneath.@refill + +In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top} +sectioning command is merely a synonym for @code{@@unnumbered}. +Neither of these formatters require an @code{@@top} command, and do +nothing special with it. You can use @code{@@chapter} or +@code{@@unnumbered} after the @code{@@node Top} line when you use +these formatters. Also, you can use @code{@@chapter} or +@code{@@unnumbered} when you use the Texinfo updating commands to +create or update pointers and menus.@refill + + +@node Top Node Summary, , makeinfo top command, node +@subsection The `Top' Node Summary +@cindex @samp{@r{Top}} node summary + +You can help readers by writing a summary in the `Top' node, after the +@code{@@top} line, before the main or master menu. The summary should +briefly describe the document. In Info, this summary will appear just +before the master menu. In a printed manual, this summary will appear +on a page of its own.@refill + +If you do not want the summary to appear on a page of its own in a +printed manual, you can enclose the whole of the `Top' node, including +the @code{@@node Top} line and the @code{@@top} sectioning command line +or other sectioning command line between @code{@@ifinfo} and @code{@@end +ifinfo}. This prevents any of the text from appearing in the printed +output. (@pxref{Conditionals, , Conditionally Visible Text}). You can +repeat the brief description from the `Top' node within @code{@@iftex} +@dots{} @code{@@end iftex} at the beginning of the first chapter, for +those who read the printed manual. This saves paper and may look +neater.@refill + +You should write the version number of the program to which the manual +applies in the summary. This helps the reader keep track of which +manual is for which version of the program. If the manual changes more +frequently than the program or is independent of it, you should also +include an edition number for the manual. (The title page should also +contain this information: see @ref{titlepage, , +@code{@@titlepage}}.)@refill + +@node makeinfo Pointer Creation, , node, Nodes +@section Creating Pointers with @code{makeinfo} +@cindex Creating pointers with @code{makeinfo} +@cindex Pointer creation with @code{makeinfo} +@cindex Automatic pointer creation with @code{makeinfo} + +The @code{makeinfo} program has a feature for automatically creating +node pointers for a hierarchically organized file that lacks +them.@refill + +When you take advantage of this feature, you do not need to write the +`Next', `Previous', and `Up' pointers after the name of a node. +However, you must write a sectioning command, such as @code{@@chapter} +or @code{@@section}, on the line immediately following each truncated +@code{@@node} line. You cannot write a comment line after a node +line; the section line must follow it immediately.@refill + +In addition, you must follow the `Top' @code{@@node} line with a line beginning +with @code{@@top} to mark the `Top' node in the file. @xref{makeinfo +top, , @code{@@top}}. + +Finally, you must write the name of each node (except for the `Top' +node) in a menu that is one or more hierarchical levels above the +node's hierarchical level.@refill + +This node pointer insertion feature in @code{makeinfo} is an +alternative to the menu and pointer creation and update commands in +Texinfo mode. (@xref{Updating Nodes and Menus}.) It is especially +helpful to people who do not use GNU Emacs for writing Texinfo +documents.@refill + +@node Menus, Cross References, Nodes, Top +@comment node-name, next, previous, up +@chapter Menus +@cindex Menus +@findex menu + +@dfn{Menus} contain pointers to subordinate +nodes.@footnote{Menus can carry you to any node, regardless +of the hierarchical structure; even to nodes in a different +Info file. However, the GNU Emacs Texinfo mode updating +commands work only to create menus of subordinate nodes. +Conventionally, cross references are used to refer to other +nodes.} In Info, you use menus to go to such nodes. Menus +have no effect in printed manuals and do not appear in +them.@refill + +By convention, a menu is put at the end of a node since a reader who +uses the menu may not see text that follows it.@refill + +@ifinfo +A node that has a menu should @emph{not} contain much text. If you +have a lot of text and a menu, move most of the text into a new +subnode---all but a few lines.@refill +@end ifinfo +@iftex +@emph{A node that has a menu should not contain much text.} If you +have a lot of text and a menu, move most of the text into a new +subnode---all but a few lines. Otherwise, a reader with a terminal +that displays only a few lines may miss the menu and its associated +text. As a practical matter, you should locate a menu within 20 lines +of the beginning of the node.@refill +@end iftex + +@menu +* Menu Location:: Put a menu in a short node. +* Writing a Menu:: What is a menu? +* Menu Parts:: A menu entry has three parts. +* Less Cluttered Menu Entry:: Two part menu entry. +* Menu Example:: Two and three part menu entries. +* Other Info Files:: How to refer to a different Info file. +@end menu + +@node Menu Location, Writing a Menu, Menus, Menus +@ifinfo +@heading Menus Need Short Nodes +@end ifinfo +@cindex Menu location +@cindex Location of menus +@cindex Nodes for menus are short +@cindex Short nodes for menus + +@ifinfo +A reader can easily see a menu that is close to the beginning of the +node. The node should be short. As a practical matter, you should +locate a menu within 20 lines of the beginning of the node. +Otherwise, a reader with a terminal that displays only a few lines may +miss the menu and its associated text.@refill +@end ifinfo + +The short text before a menu may look awkward in a printed manual. To +avoid this, you can write a menu near the beginning of its node and +follow the menu by an @code{@@node} line, and then an @code{@@heading} +line located within @code{@@ifinfo} and @code{@@end ifinfo}. This way, +the menu, @code{@@node} line, and title appear only in the Info file, +not the printed document.@refill + +For example, the preceding two paragraphs follow an Info-only menu, +@code{@@node} line, and heading, and look like this:@refill + +@example +@group +@@menu +* Menu Location:: Put a menu in a short node. +* Writing a Menu:: What is a menu? +* Menu Parts:: A menu entry has three parts. +* Less Cluttered Menu Entry:: Two part menu entry. +* Menu Example:: Two and three part entries. +* Other Info Files:: How to refer to a different + Info file. +@@end menu + +@@node Menu Location, Writing a Menu, , Menus +@@ifinfo +@@heading Menus Need Short Nodes +@@end ifinfo +@end group +@end example + +The Texinfo file for this document contains more than a dozen +examples of this procedure. One is at the beginning of this chapter; +another is at the beginning of the ``Cross References'' chapter.@refill + +@node Writing a Menu, Menu Parts, Menu Location, Menus +@section Writing a Menu +@cindex Writing a menu +@cindex Menu writing + +A menu consists of an @code{@@menu} command on a line by +itself followed by menu entry lines or menu comment lines +and then by an @code{@@end menu} command on a line by +itself.@refill + +A menu looks like this:@refill + +@example +@group +@@menu +Larger Units of Text + +* Files:: All about handling files. +* Multiples: Buffers. Multiple buffers; editing + several files at once. +@@end menu +@end group +@end example + +In a menu, every line that begins with an @w{@samp{* }} is a +@dfn{menu entry}. (Note the space after the asterisk.) A +line that does not start with an @w{@samp{* }} may also +appear in a menu. Such a line is not a menu entry but is a +menu comment line that appears in the Info file. In +the example above, the line @samp{Larger Units of Text} is a +menu comment line; the two lines starting with @w{@samp{* }} +are menu entries. + +@node Menu Parts, Less Cluttered Menu Entry, Writing a Menu, Menus +@section The Parts of a Menu +@cindex Parts of a menu +@cindex Menu parts +@cindex @code{@@menu} parts + +A menu entry has three parts, only the second of which is required: + +@enumerate +@item +The menu entry name (optional). + +@item +The name of the node (required). + +@item +A description of the item (optional). +@end enumerate + +The template for a menu entry looks like this:@refill + +@example +* @var{menu-entry-name}: @var{node-name}. @var{description} +@end example + +Follow the menu entry name with a single colon and follow the node name +with tab, comma, period, or newline.@refill + +In Info, a user selects a node with the @kbd{m} (@code{Info-menu}) +command. The menu entry name is what the user types after the @kbd{m} +command.@refill + +The third part of a menu entry is a descriptive phrase or sentence. +Menu entry names and node names are often short; the description +explains to the reader what the node is about. A useful description +complements the node name rather than repeats it. The description, +which is optional, can spread over two or more lines; if it does, some +authors prefer to indent the second line while others prefer to align it +with the first (and all others). It's up to you. + + +@node Less Cluttered Menu Entry, Menu Example, Menu Parts, Menus +@comment node-name, next, previous, up +@section Less Cluttered Menu Entry +@cindex Two part menu entry +@cindex Double-colon menu entries +@cindex Menu entries with two colons +@cindex Less cluttered menu entry +@cindex Uncluttered menu entry + +When the menu entry name and node name are the same, you can write +the name immediately after the asterisk and space at the beginning of +the line and follow the name with two colons.@refill + +@need 800 +For example, write + +@example +* Name:: @var{description} +@end example + +@need 800 +@noindent +instead of + +@example +* Name: Name. @var{description} +@end example + +You should use the node name for the menu entry name whenever possible, +since it reduces visual clutter in the menu.@refill + +@node Menu Example, Other Info Files, Less Cluttered Menu Entry, Menus +@comment node-name, next, previous, up +@section A Menu Example +@cindex Menu example +@cindex Example menu + +A menu looks like this in Texinfo:@refill + +@example +@group +@@menu +* menu entry name: Node name. A short description. +* Node name:: This form is preferred. +@@end menu +@end group +@end example + +@need 800 +@noindent +This produces: + +@example +@group +* menu: + +* menu entry name: Node name. A short description. +* Node name:: This form is preferred. +@end group +@end example + +@need 700 +Here is an example as you might see it in a Texinfo file:@refill + +@example +@group +@@menu +Larger Units of Text + +* Files:: All about handling files. +* Multiples: Buffers. Multiple buffers; editing + several files at once. +@@end menu +@end group +@end example + +@need 800 +@noindent +This produces: + +@example +@group +* menu: +Larger Units of Text + +* Files:: All about handling files. +* Multiples: Buffers. Multiple buffers; editing + several files at once. +@end group +@end example + +In this example, the menu has two entries. @samp{Files} is both a menu +entry name and the name of the node referred to by that name. +@samp{Multiples} is the menu entry name; it refers to the node named +@samp{Buffers}. The line @samp{Larger Units of Text} is a comment; it +appears in the menu, but is not an entry.@refill + +Since no file name is specified with either @samp{Files} or +@samp{Buffers}, they must be the names of nodes in the same Info file +(@pxref{Other Info Files, , Referring to Other Info Files}).@refill + +@node Other Info Files, , Menu Example, Menus +@comment node-name, next, previous, up +@section Referring to Other Info Files +@cindex Referring to other Info files +@cindex Nodes in other Info files +@cindex Other Info files' nodes +@cindex Going to other Info files' nodes +@cindex Info; other files' nodes + +You can create a menu entry that enables a reader in Info to go to a +node in another Info file by writing the file name in parentheses just +before the node name. In this case, you should use the three-part menu +entry format, which saves the reader from having to type the file +name.@refill + +@need 800 +The format looks like this:@refill + +@example +@group +@@menu +* @var{first-entry-name}:(@var{filename})@var{nodename}. @var{description} +* @var{second-entry-name}:(@var{filename})@var{second-node}. @var{description} +@@end menu +@end group +@end example + +For example, to refer directly to the @samp{Outlining} and +@samp{Rebinding} nodes in the @cite{Emacs Manual}, you would write a +menu like this:@refill + +@example +@group +@@menu +* Outlining: (emacs)Outline Mode. The major mode for + editing outlines. +* Rebinding: (emacs)Rebinding. How to redefine the + meaning of a key. +@@end menu +@end group +@end example + +If you do not list the node name, but only name the file, then Info +presumes that you are referring to the `Top' node.@refill + +The @file{dir} file that contains the main menu for Info has menu +entries that list only file names. These take you directly to the `Top' +nodes of each Info document. (@xref{Install an Info File}.)@refill + +@need 700 +For example: + +@example +@group +* Info: (info). Documentation browsing system. +* Emacs: (emacs). The extensible, self-documenting + text editor. +@end group +@end example + +@noindent +(The @file{dir} top level directory for the Info system is an Info file, +not a Texinfo file, but a menu entry looks the same in both types of +file.)@refill + +Note that the GNU Emacs Texinfo mode menu updating commands only work +with nodes within the current buffer, so you cannot use them to create +menus that refer to other files. You must write such menus by hand.@refill + +@node Cross References, Marking Text, Menus, Top +@comment node-name, next, previous, up +@chapter Cross References +@cindex Making cross references +@cindex Cross references +@cindex References + +@dfn{Cross references} are used to refer the reader to other parts of the +same or different Texinfo files. In Texinfo, nodes are the +places to which cross references can refer.@refill + +@menu +* References:: What cross references are for. +* Cross Reference Commands:: A summary of the different commands. +* Cross Reference Parts:: A cross reference has several parts. +* xref:: Begin a reference with `See' @dots{} +* Top Node Naming:: How to refer to the beginning of another file. +* ref:: A reference for the last part of a sentence. +* pxref:: How to write a parenthetical cross reference. +* inforef:: How to refer to an Info-only file. +* uref:: How to refer to a uniform resource locator. +@end menu + +@node References, Cross Reference Commands, Cross References, Cross References +@ifinfo +@heading What References Are For +@end ifinfo + +Often, but not always, a printed document should be designed so that +it can be read sequentially. People tire of flipping back and forth +to find information that should be presented to them as they need +it.@refill + +However, in any document, some information will be too detailed for +the current context, or incidental to it; use cross references to +provide access to such information. Also, an on-line help system or a +reference manual is not like a novel; few read such documents in +sequence from beginning to end. Instead, people look up what they +need. For this reason, such creations should contain many cross +references to help readers find other information that they may not +have read.@refill + +In a printed manual, a cross reference results in a page reference, +unless it is to another manual altogether, in which case the cross +reference names that manual.@refill + +In Info, a cross reference results in an entry that you can follow using +the Info @samp{f} command. (@inforef{Help-Adv, Some advanced Info +commands, info}.)@refill + +The various cross reference commands use nodes to define cross +reference locations. This is evident in Info, in which a cross +reference takes you to the specified node. @TeX{} also uses nodes to +define cross reference locations, but the action is less obvious. When +@TeX{} generates a DVI file, it records nodes' page numbers and +uses the page numbers in making references. Thus, if you are writing +a manual that will only be printed, and will not be used on-line, you +must nonetheless write @code{@@node} lines to name the places to which +you make cross references.@refill + +@need 800 +@node Cross Reference Commands, Cross Reference Parts, References, Cross References +@comment node-name, next, previous, up +@section Different Cross Reference Commands +@cindex Different cross reference commands + +There are four different cross reference commands:@refill + +@table @code +@item @@xref +Used to start a sentence in the printed manual saying @w{`See @dots{}'} +or an Info cross-reference saying @samp{*Note @var{name}: @var{node}.}. + +@item @@ref +Used within or, more often, at the end of a sentence; same as +@code{@@xref} for Info; produces just the reference in the printed +manual without a preceding `See'.@refill + +@item @@pxref +Used within parentheses to make a reference that suits both an Info +file and a printed book. Starts with a lower case `see' within the +printed manual. (@samp{p} is for `parenthesis'.)@refill + +@item @@inforef +Used to make a reference to an Info file for which there is no printed +manual.@refill +@end table + +@noindent +(The @code{@@cite} command is used to make references to books and +manuals for which there is no corresponding Info file and, therefore, +no node to which to point. @xref{cite, , @code{@@cite}}.)@refill + +@node Cross Reference Parts, xref, Cross Reference Commands, Cross References +@comment node-name, next, previous, up +@section Parts of a Cross Reference +@cindex Cross reference parts +@cindex Parts of a cross reference + +A cross reference command requires only one argument, which is the +name of the node to which it refers. But a cross reference command +may contain up to four additional arguments. By using these +arguments, you can provide a cross reference name for Info, a topic +description or section title for the printed output, the name of a +different Info file, and the name of a different printed +manual.@refill + +Here is a simple cross reference example:@refill + +@example +@@xref@{Node name@}. +@end example + +@noindent +which produces + +@example +*Note Node name::. +@end example + +@noindent +and + +@quotation +See Section @var{nnn} [Node name], page @var{ppp}. +@end quotation + +@need 700 +Here is an example of a full five-part cross reference:@refill + +@example +@group +@@xref@{Node name, Cross Reference Name, Particular Topic, +info-file-name, A Printed Manual@}, for details. +@end group +@end example + +@noindent +which produces + +@example +*Note Cross Reference Name: (info-file-name)Node name, +for details. +@end example + +@noindent +in Info and + +@quotation +See section ``Particular Topic'' in @i{A Printed Manual}, for details. +@end quotation + +@noindent +in a printed book. + +The five possible arguments for a cross reference are:@refill + +@enumerate +@item +The node name (required). This is the node to which the +cross reference takes you. In a printed document, the location of the +node provides the page reference only for references within the same +document.@refill + +@item +The cross reference name for the Info reference, if it is to be different +from the node name. If you include this argument, it becomes +the first part of the cross reference. It is usually omitted.@refill + +@item +A topic description or section name. Often, this is the title of the +section. This is used as the name of the reference in the printed +manual. If omitted, the node name is used.@refill + +@item +The name of the Info file in which the reference is located, if it is +different from the current file. You need not include any @samp{.info} +suffix on the file name, since Info readers try appending it +automatically. + +@item +The name of a printed manual from a different Texinfo file.@refill +@end enumerate + +The template for a full five argument cross reference looks like +this:@refill + +@example +@group +@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}, +@var{info-file-name}, @var{printed-manual-title}@}. +@end group +@end example + +Cross references with one, two, three, four, and five arguments are +described separately following the description of @code{@@xref}.@refill + +Write a node name in a cross reference in exactly the same way as in +the @code{@@node} line, including the same capitalization; otherwise, the +formatters may not find the reference.@refill + +You can write cross reference commands within a paragraph, but note +how Info and @TeX{} format the output of each of the various commands: +write @code{@@xref} at the beginning of a sentence; write +@code{@@pxref} only within parentheses, and so on.@refill + +@node xref, Top Node Naming, Cross Reference Parts, Cross References +@comment node-name, next, previous, up +@section @code{@@xref} +@findex xref +@cindex Cross references using @code{@@xref} +@cindex References using @code{@@xref} + +The @code{@@xref} command generates a cross reference for the +beginning of a sentence. The Info formatting commands convert it into +an Info cross reference, which the Info @samp{f} command can use to +bring you directly to another node. The @TeX{} typesetting commands +convert it into a page reference, or a reference to another book or +manual.@refill + +@menu +* Reference Syntax:: What a reference looks like and requires. +* One Argument:: @code{@@xref} with one argument. +* Two Arguments:: @code{@@xref} with two arguments. +* Three Arguments:: @code{@@xref} with three arguments. +* Four and Five Arguments:: @code{@@xref} with four and five arguments. +@end menu + +@node Reference Syntax, One Argument, xref, xref +@ifinfo +@subheading What a Reference Looks Like and Requires +@end ifinfo + +Most often, an Info cross reference looks like this:@refill + +@example +*Note @var{node-name}::. +@end example + +@noindent +or like this + +@example +*Note @var{cross-reference-name}: @var{node-name}. +@end example + +@noindent +In @TeX{}, a cross reference looks like this: + +@example +See Section @var{section-number} [@var{node-name}], page @var{page}. +@end example + +@noindent +or like this + +@example +See Section @var{section-number} [@var{title-or-topic}], page @var{page}. +@end example + +The @code{@@xref} command does not generate a period or comma to end +the cross reference in either the Info file or the printed output. +You must write that period or comma yourself; otherwise, Info will not +recognize the end of the reference. (The @code{@@pxref} command works +differently. @xref{pxref, , @code{@@pxref}}.)@refill + +@quotation +@strong{Please note:} A period or comma @strong{must} follow the closing +brace of an @code{@@xref}. It is required to terminate the cross +reference. This period or comma will appear in the output, both in +the Info file and in the printed manual.@refill +@end quotation + +@code{@@xref} must refer to an Info node by name. Use @code{@@node} +to define the node (@pxref{Writing a Node}).@refill + +@code{@@xref} is followed by several arguments inside braces, separated by +commas. Whitespace before and after these commas is ignored.@refill + +A cross reference requires only the name of a node; but it may contain +up to four additional arguments. Each of these variations produces a +cross reference that looks somewhat different.@refill + +@quotation +@strong{Please note:} Commas separate arguments in a cross reference; +avoid including them in the title or other part lest the formatters +mistake them for separators.@refill +@end quotation + +@node One Argument, Two Arguments, Reference Syntax, xref +@subsection @code{@@xref} with One Argument + +The simplest form of @code{@@xref} takes one argument, the name of +another node in the same Info file. The Info formatters produce +output that the Info readers can use to jump to the reference; @TeX{} +produces output that specifies the page and section number for you.@refill + +@need 700 +@noindent +For example, + +@example +@@xref@{Tropical Storms@}. +@end example + +@noindent +produces + +@example +*Note Tropical Storms::. +@end example + +@noindent +and + +@quotation +See Section 3.1 [Tropical Storms], page 24. +@end quotation + +@noindent +(Note that in the preceding example the closing brace is followed by a +period.)@refill + +You can write a clause after the cross reference, like this:@refill + +@example +@@xref@{Tropical Storms@}, for more info. +@end example + +@noindent +which produces + +@example +*Note Tropical Storms::, for more info. +@end example + +@quotation +See Section 3.1 [Tropical Storms], page 24, for more info. +@end quotation + +@noindent +(Note that in the preceding example the closing brace is followed by a +comma, and then by the clause, which is followed by a period.)@refill + +@node Two Arguments, Three Arguments, One Argument, xref +@subsection @code{@@xref} with Two Arguments + +With two arguments, the second is used as the name of the Info cross +reference, while the first is still the name of the node to which the +cross reference points.@refill + +@need 750 +@noindent +The template is like this: + +@example +@@xref@{@var{node-name}, @var{cross-reference-name}@}. +@end example + +@need 700 +@noindent +For example, + +@example +@@xref@{Electrical Effects, Lightning@}. +@end example + +@noindent +produces: + +@example +*Note Lightning: Electrical Effects. +@end example + +@noindent +and + +@quotation +See Section 5.2 [Electrical Effects], page 57. +@end quotation + +@noindent +(Note that in the preceding example the closing brace is followed by a +period; and that the node name is printed, not the cross reference name.)@refill + +You can write a clause after the cross reference, like this:@refill + +@example +@@xref@{Electrical Effects, Lightning@}, for more info. +@end example + +@noindent +which produces +@example +*Note Lightning: Electrical Effects, for more info. +@end example + +@noindent +and + +@quotation +See Section 5.2 [Electrical Effects], page 57, for more info. +@end quotation + +@noindent +(Note that in the preceding example the closing brace is followed by a +comma, and then by the clause, which is followed by a period.)@refill + +@node Three Arguments, Four and Five Arguments, Two Arguments, xref +@subsection @code{@@xref} with Three Arguments + +A third argument replaces the node name in the @TeX{} output. The third +argument should be the name of the section in the printed output, or +else state the topic discussed by that section. Often, you will want to +use initial upper case letters so it will be easier to read when the +reference is printed. Use a third argument when the node name is +unsuitable because of syntax or meaning.@refill + +Remember to avoid placing a comma within the title or topic section of +a cross reference, or within any other section. The formatters divide +cross references into arguments according to the commas; a comma +within a title or other section will divide it into two arguments. In +a reference, you need to write a title such as ``Clouds, Mist, and +Fog'' without the commas.@refill + +Also, remember to write a comma or period after the closing brace of a +@code{@@xref} to terminate the cross reference. In the following +examples, a clause follows a terminating comma.@refill + + +@need 750 +@noindent +The template is like this: + +@example +@group +@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}@}. +@end group +@end example + +@need 700 +@noindent +For example, + +@example +@group +@@xref@{Electrical Effects, Lightning, Thunder and Lightning@}, +for details. +@end group +@end example + +@noindent +produces + +@example +*Note Lightning: Electrical Effects, for details. +@end example + +@noindent +and + +@quotation +See Section 5.2 [Thunder and Lightning], page 57, for details. +@end quotation + +If a third argument is given and the second one is empty, then the +third argument serves both. (Note how two commas, side by side, mark +the empty second argument.)@refill + +@example +@group +@@xref@{Electrical Effects, , Thunder and Lightning@}, +for details. +@end group +@end example + +@noindent +produces + +@example +*Note Thunder and Lightning: Electrical Effects, for details. +@end example + +@noindent +and + +@quotation +See Section 5.2 [Thunder and Lightning], page 57, for details. +@end quotation + +As a practical matter, it is often best to write cross references with +just the first argument if the node name and the section title are the +same, and with the first and third arguments if the node name and title +are different.@refill + +Here are several examples from @cite{The GNU Awk User's Guide}:@refill + +@smallexample +@@xref@{Sample Program@}. +@@xref@{Glossary@}. +@@xref@{Case-sensitivity, ,Case-sensitivity in Matching@}. +@@xref@{Close Output, , Closing Output Files and Pipes@}, + for more information. +@@xref@{Regexp, , Regular Expressions as Patterns@}. +@end smallexample + +@node Four and Five Arguments, , Three Arguments, xref +@subsection @code{@@xref} with Four and Five Arguments + +In a cross reference, a fourth argument specifies the name of another +Info file, different from the file in which the reference appears, and +a fifth argument specifies its title as a printed manual.@refill + +Remember that a comma or period must follow the closing brace of an +@code{@@xref} command to terminate the cross reference. In the +following examples, a clause follows a terminating comma.@refill + +@need 800 +@noindent +The template is: + +@example +@group +@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}, +@var{info-file-name}, @var{printed-manual-title}@}. +@end group +@end example + +@need 700 +@noindent +For example, + +@example +@@xref@{Electrical Effects, Lightning, Thunder and Lightning, +weather, An Introduction to Meteorology@}, for details. +@end example + +@noindent +produces + +@example +*Note Lightning: (weather)Electrical Effects, for details. +@end example + +@noindent +The name of the Info file is enclosed in parentheses and precedes +the name of the node. + +@noindent +In a printed manual, the reference looks like this:@refill + +@quotation +See section ``Thunder and Lightning'' in @i{An Introduction to +Meteorology}, for details. +@end quotation + +@noindent +The title of the printed manual is typeset in italics; and the +reference lacks a page number since @TeX{} cannot know to which page a +reference refers when that reference is to another manual.@refill + +Often, you will leave out the second argument when you use the long +version of @code{@@xref}. In this case, the third argument, the topic +description, will be used as the cross reference name in Info.@refill + +@noindent +The template looks like this: + +@example +@@xref@{@var{node-name}, , @var{title-or-topic}, @var{info-file-name}, +@var{printed-manual-title}@}, for details. +@end example + +@noindent +which produces + +@example +*Note @var{title-or-topic}: (@var{info-file-name})@var{node-name}, for details. +@end example + +@noindent +and + +@quotation +See section @var{title-or-topic} in @var{printed-manual-title}, for details. +@end quotation + +@need 700 +@noindent +For example, + +@example +@@xref@{Electrical Effects, , Thunder and Lightning, +weather, An Introduction to Meteorology@}, for details. +@end example + +@noindent +produces + +@example +@group +*Note Thunder and Lightning: (weather)Electrical Effects, +for details. +@end group +@end example + +@noindent +and + +@quotation +See section ``Thunder and Lightning'' in @i{An Introduction to +Meteorology}, for details. +@end quotation + +On rare occasions, you may want to refer to another Info file that +is within a single printed manual---when multiple Texinfo files are +incorporated into the same @TeX{} run but make separate Info files. +In this case, you need to specify only the fourth argument, and not +the fifth.@refill + +@node Top Node Naming, ref, xref, Cross References +@section Naming a `Top' Node +@cindex Naming a `Top' Node in references +@cindex @samp{@r{Top}} node naming for references + +In a cross reference, you must always name a node. This means that in +order to refer to a whole manual, you must identify the `Top' node by +writing it as the first argument to the @code{@@xref} command. (This +is different from the way you write a menu entry; see @ref{Other Info +Files, , Referring to Other Info Files}.) At the same time, to +provide a meaningful section topic or title in the printed cross +reference (instead of the word `Top'), you must write an appropriate +entry for the third argument to the @code{@@xref} command. +@refill + +@noindent +Thus, to make a cross reference to @cite{The GNU Make Manual}, +write:@refill + +@example +@@xref@{Top, , Overview, make, The GNU Make Manual@}. +@end example + +@noindent +which produces + +@example +*Note Overview: (make)Top. +@end example + +@noindent +and + +@quotation +See section ``Overview'' in @i{The GNU Make Manual}. +@end quotation + +@noindent +In this example, @samp{Top} is the name of the first node, and +@samp{Overview} is the name of the first section of the manual.@refill +@node ref, pxref, Top Node Naming, Cross References +@comment node-name, next, previous, up +@section @code{@@ref} +@cindex Cross references using @code{@@ref} +@cindex References using @code{@@ref} +@findex ref + +@code{@@ref} is nearly the same as @code{@@xref} except that it does +not generate a `See' in the printed output, just the reference itself. +This makes it useful as the last part of a sentence.@refill + +@need 700 +@noindent +For example, + +@example +For more information, see @@ref@{Hurricanes@}. +@end example + +@noindent +produces + +@example +For more information, see *Note Hurricanes. +@end example + +@noindent +and + +@quotation +For more information, see Section 8.2 [Hurricanes], page 123. +@end quotation + +The @code{@@ref} command sometimes leads writers to express themselves +in a manner that is suitable for a printed manual but looks awkward +in the Info format. Bear in mind that your audience will be using +both the printed and the Info format.@refill + +@need 800 +@noindent +For example, + +@example +@group +Sea surges are described in @@ref@{Hurricanes@}. +@end group +@end example + +@need 800 +@noindent +produces + +@quotation +Sea surges are described in Section 6.7 [Hurricanes], page 72. +@end quotation + +@need 800 +@noindent +in a printed document, and the following in Info: + +@example +Sea surges are described in *Note Hurricanes::. +@end example + +@quotation +@strong{Caution:} You @emph{must} write a period or comma immediately +after an @code{@@ref} command with two or more arguments. Otherwise, +Info will not find the end of the cross reference entry and its +attempt to follow the cross reference will fail. As a general rule, +you should write a period or comma after every @code{@@ref} command. +This looks best in both the printed and the Info output.@refill +@end quotation + +@node pxref, inforef, ref, Cross References +@comment node-name, next, previous, up +@section @code{@@pxref} +@cindex Cross references using @code{@@pxref} +@cindex References using @code{@@pxref} +@findex pxref + +The parenthetical reference command, @code{@@pxref}, is nearly the +same as @code{@@xref}, but you use it @emph{only} inside parentheses +and you do @emph{not} type a comma or period after the command's +closing brace. The command differs from @code{@@xref} in two +ways:@refill + +@enumerate +@item +@TeX{} typesets the reference for the printed manual with a lower case +`see' rather than an upper case `See'.@refill + +@item +The Info formatting commands automatically end the reference with a +closing colon or period.@refill +@end enumerate + +Because one type of formatting automatically inserts closing +punctuation and the other does not, you should use @code{@@pxref} +@emph{only} inside parentheses as part of another sentence. Also, you +yourself should not insert punctuation after the reference, as you do +with @code{@@xref}.@refill + +@code{@@pxref} is designed so that the output looks right and works +right between parentheses both in printed output and in an Info file. +In a printed manual, a closing comma or period should not follow a +cross reference within parentheses; such punctuation is wrong. But in +an Info file, suitable closing punctuation must follow the cross +reference so Info can recognize its end. @code{@@pxref} spares you +the need to use complicated methods to put a terminator into one form +of the output and not the other.@refill + +@noindent +With one argument, a parenthetical cross reference looks like +this:@refill + +@example +@dots{} storms cause flooding (@@pxref@{Hurricanes@}) @dots{} +@end example + +@need 800 +@noindent +which produces + +@example +@group +@dots{} storms cause flooding (*Note Hurricanes::) @dots{} +@end group +@end example + +@noindent +and + +@quotation +@dots{} storms cause flooding (see Section 6.7 [Hurricanes], page 72) @dots{} +@end quotation + +With two arguments, a parenthetical cross reference has this +template:@refill + +@example +@dots{} (@@pxref@{@var{node-name}, @var{cross-reference-name}@}) @dots{} +@end example + +@noindent +which produces + +@example +@dots{} (*Note @var{cross-reference-name}: @var{node-name}.) @dots{} +@end example + +@noindent +and + +@need 1500 +@quotation +@dots{} (see Section @var{nnn} [@var{node-name}], page @var{ppp}) @dots{} +@end quotation + +@code{@@pxref} can be used with up to five arguments just like +@code{@@xref} (@pxref{xref, , @code{@@xref}}).@refill + +@quotation +@strong{Please note:} Use @code{@@pxref} only as a parenthetical +reference. Do not try to use @code{@@pxref} as a clause in a sentence. +It will look bad in either the Info file, the printed output, or +both.@refill + +Also, parenthetical cross references look best at the ends of sentences. +Although you may write them in the middle of a sentence, that location +breaks up the flow of text.@refill +@end quotation + +@node inforef, uref, pxref, Cross References +@section @code{@@inforef} +@cindex Cross references using @code{@@inforef} +@cindex References using @code{@@inforef} +@findex inforef + +@code{@@inforef} is used for cross references to Info files for which +there are no printed manuals. Even in a printed manual, +@code{@@inforef} generates a reference directing the user to look in +an Info file.@refill + +The command takes either two or three arguments, in the following +order:@refill + +@enumerate +@item +The node name. + +@item +The cross reference name (optional). + +@item +The Info file name. +@end enumerate + +@noindent +Separate the arguments with commas, as with @code{@@xref}. Also, you +must terminate the reference with a comma or period after the +@samp{@}}, as you do with @code{@@xref}.@refill + +@noindent +The template is: + +@example +@@inforef@{@var{node-name}, @var{cross-reference-name}, @var{info-file-name}@}, +@end example + +@need 800 +@noindent +Thus, + +@example +@group +@@inforef@{Expert, Advanced Info commands, info@}, +for more information. +@end group +@end example + +@need 800 +@noindent +produces + +@example +@group +*Note Advanced Info commands: (info)Expert, +for more information. +@end group +@end example + +@need 800 +@noindent +and + +@quotation +See Info file @file{info}, node @samp{Expert}, for more information. +@end quotation + +@need 800 +@noindent +Similarly, + +@example +@group +@@inforef@{Expert, , info@}, for more information. +@end group +@end example + +@need 800 +@noindent +produces + +@example +*Note (info)Expert::, for more information. +@end example + +@need 800 +@noindent +and + +@quotation +See Info file @file{info}, node @samp{Expert}, for more information. +@end quotation + +The converse of @code{@@inforef} is @code{@@cite}, which is used to +refer to printed works for which no Info form exists. @xref{cite, , +@code{@@cite}}.@refill + + +@node uref, , inforef, Cross References +@section @code{@@uref@{@var{url}[, @var{displayed-text}]@}} +@findex uref +@cindex Uniform resource locator, referring to +@cindex URL, referring to + +@code{@@uref} produces a reference to a uniform resource locator (URL). +It takes one mandatory argument, the URL, and one optional argument, the +text to display (the default is the URL itself). In HTML output, +@code{@@uref} produces a link you can follow. For example: + +@example +The official GNU ftp site is +@@uref@{ftp://ftp.gnu.ai.mit.edu/pub/gnu@} +@end example + +@noindent produces (in text): +@display +The official GNU ftp site is +@uref{ftp://ftp.gnu.ai.mit.edu/pub/gnu} +@end display + +@noindent whereas +@example +The official +@@uref@{ftp://ftp.gnu.ai.mit.edu/pub/gnu, + GNU ftp site@} holds programs and texts. +@end example + +@noindent produces (in text): +@display +The official @uref{ftp://ftp.gnu.ai.mit.edu/pub/gnu, GNU ftp site} holds +programs and texts. +@end display + +@noindent and (in HTML): +@example +The official <A HREF="ftp://ftp.gnu.ai.mit.edu/pub/gnu">GNU ftp +site</A> holds programs and texts. +@end example + +To merely indicate a URL, use @code{@@url} (@pxref{url, @code{@@url}}). + + +@node Marking Text, Quotations and Examples, Cross References, Top +@comment node-name, next, previous, up +@chapter Marking Words and Phrases +@cindex Paragraph, marking text within +@cindex Marking words and phrases +@cindex Words and phrases, marking them +@cindex Marking text within a paragraph + +In Texinfo, you can mark words and phrases in a variety of ways. +The Texinfo formatters use this information to determine how to +highlight the text. +You can specify, for example, whether a word or phrase is a +defining occurrence, a metasyntactic variable, or a symbol used in a +program. Also, you can emphasize text.@refill + +@menu +* Indicating:: How to indicate definitions, files, etc. +* Emphasis:: How to emphasize text. +@end menu + +@node Indicating, Emphasis, Marking Text, Marking Text +@comment node-name, next, previous, up +@section Indicating Definitions, Commands, etc. +@cindex Highlighting text +@cindex Indicating commands, definitions, etc. + +Texinfo has commands for indicating just what kind of object a piece of +text refers to. For example, metasyntactic variables are marked by +@code{@@var}, and code by @code{@@code}. Since the pieces of text are +labelled by commands that tell what kind of object they are, it is easy +to change the way the Texinfo formatters prepare such text. (Texinfo is +an @emph{intentional} formatting language rather than a @emph{typesetting} +formatting language.)@refill + +For example, in a printed manual, +code is usually illustrated in a typewriter font; +@code{@@code} tells @TeX{} to typeset this text in this font. But it +would be easy to change the way @TeX{} highlights code to use another +font, and this change would not effect how keystroke examples are +highlighted. If straight typesetting commands were used in the body +of the file and you wanted to make a change, you would need to check +every single occurrence to make sure that you were changing code and +not something else that should not be changed.@refill + +@menu +* Useful Highlighting:: Highlighting provides useful information. +* code:: How to indicate code. +* kbd:: How to show keyboard input. +* key:: How to specify keys. +* samp:: How to show a literal sequence of characters. +* var:: How to indicate a metasyntactic variable. +* file:: How to indicate the name of a file. +* dfn:: How to specify a definition. +* cite:: How to refer to a book that is not in Info. +* url:: How to indicate a world wide web reference. +* email:: How to indicate an electronic mail address. +@end menu + +@node Useful Highlighting, code, Indicating, Indicating +@ifinfo +@subheading Highlighting Commands are Useful +@end ifinfo + +The highlighting commands can be used to generate useful information +from the file, such as lists of functions or file names. It is +possible, for example, to write a program in Emacs Lisp (or a keyboard +macro) to insert an index entry after every paragraph that contains +words or phrases marked by a specified command. You could do this to +construct an index of functions if you had not already made the +entries.@refill + +The commands serve a variety of purposes:@refill + +@table @code +@item @@code@{@var{sample-code}@} +Indicate text that is a literal example of a piece of a program.@refill + +@item @@kbd@{@var{keyboard-characters}@} +Indicate keyboard input.@refill + +@item @@key@{@var{key-name}@} +Indicate the conventional name for a key on a keyboard.@refill + +@item @@samp@{@var{text}@} +Indicate text that is a literal example of a sequence of characters.@refill + +@item @@var@{@var{metasyntactic-variable}@} +Indicate a metasyntactic variable.@refill + +@item @@url@{@var{uniform-resource-locator}@} +Indicate a uniform resource locator for the World Wide Web. + +@item @@file@{@var{file-name}@} +Indicate the name of a file.@refill + +@item @@email@{@var{email-address}[, @var{displayed-text}]@} +Indicate an electronic mail address. + +@item @@dfn@{@var{term}@} +Indicate the introductory or defining use of a term.@refill + +@item @@cite@{@var{reference}@} +Indicate the name of a book.@refill + +@ignore +@item @@ctrl@{@var{ctrl-char}@} +Use for an @sc{ascii} control character.@refill +@end ignore +@end table + +@node code, kbd, Useful Highlighting, Indicating +@comment node-name, next, previous, up +@subsection @code{@@code}@{@var{sample-code}@} +@findex code + +Use the @code{@@code} command to indicate text that is a piece of a +program and which consists of entire syntactic tokens. Enclose the +text in braces.@refill + +Thus, you should use @code{@@code} for an expression in a program, for +the name of a variable or function used in a program, or for a +keyword. Also, you should use @code{@@code} for the name of a +program, such as @code{diff}, that is a name used in the machine. (You +should write the name of a program in the ordinary text font if you +regard it as a new English word, such as `Emacs' or `Bison'.)@refill + +Use @code{@@code} for environment variables such as @code{TEXINPUTS}, +and other variables.@refill + +Use @code{@@code} for command names in command languages that +resemble programming languages, such as Texinfo or the shell. +For example, @code{@@code} and @code{@@samp} are produced by writing +@samp{@@code@{@@@@code@}} and @samp{@@code@{@@@@samp@}} in the Texinfo +source, respectively.@refill + +Note, however, that you should not use @code{@@code} for shell options +such as @samp{-c} when such options stand alone. (Use @code{@@samp}.) +Also, an entire shell command often looks better if written using +@code{@@samp} rather than @code{@@code}. In this case, the rule is to +choose the more pleasing format.@refill + +It is incorrect to alter the case of a word inside an @code{@@code} +command when it appears at the beginning of a sentence. Most computer +languages are case sensitive. In C, for example, @code{Printf} is +different from the identifier @code{printf}, and most likely is a +misspelling of it. Even in languages which are not case sensitive, it +is confusing to a human reader to see identifiers spelled in different +ways. Pick one spelling and always use that. If you do not want to +start a sentence with a command written all in lower case, you should +rearrange the sentence.@refill + +Do not use the @code{@@code} command for a string of characters shorter +than a syntactic token. If you are writing about @samp{TEXINPU}, which +is just a part of the name for the @code{TEXINPUTS} environment +variable, you should use @code{@@samp}.@refill + +In particular, you should not use the @code{@@code} command when writing +about the characters used in a token; do not, for example, use +@code{@@code} when you are explaining what letters or printable symbols +can be used in the names of functions. (Use @code{@@samp}.) Also, you +should not use @code{@@code} to mark text that is considered input to +programs unless the input is written in a language that is like a +programming language. For example, you should not use @code{@@code} for +the keystroke commands of GNU Emacs (use @code{@@kbd} instead) although +you may use @code{@@code} for the names of the Emacs Lisp functions that +the keystroke commands invoke.@refill + +In the printed manual, @code{@@code} causes @TeX{} to typeset the +argument in a typewriter face. In the Info file, it causes the Info +formatting commands to use single quotation marks around the text. + +@need 700 +For example, + +@example +Use @@code@{diff@} to compare two files. +@end example + +@noindent +produces this in the printed manual:@refill + +@quotation +Use @code{diff} to compare two files. +@end quotation +@iftex + +@noindent +and this in the Info file:@refill + +@example +Use `diff' to compare two files. +@end example +@end iftex + + +@node kbd, key, code, Indicating +@subsection @code{@@kbd}@{@var{keyboard-characters}@} +@findex kbd +@cindex keyboard input + +Use the @code{@@kbd} command for characters of input to be typed by +users. For example, to refer to the characters @kbd{M-a}, +write@refill + +@example +@@kbd@{M-a@} +@end example + +@noindent +and to refer to the characters @kbd{M-x shell}, write@refill + +@example +@@kbd@{M-x shell@} +@end example + +@cindex user input +@cindex slanted typewriter font, for @code{@@kbd} +The @code{@@kbd} command has the same effect as @code{@@code} in Info, +but by default produces a different font (slanted typewriter instead of +normal typewriter) in the printed manual, so users can distinguish the +characters they are supposed to type from those the computer outputs. + +@findex kbdinputstyle +Since the usage of @code{@@kbd} varies from manual to manual, you can +control the font switching with the @code{@@kbdinputstyle} command. +This command has no effect on Info output. Write this command at the +beginning of a line with a single word as an argument, one of the +following: +@vindex distinct@r{, arg to @@kbdinputstyle} +@vindex example@r{, arg to @@kbdinputstyle} +@vindex code@r{, arg to @@kbdinputstyle} +@table @samp +@item code +Always use the same font for @code{@@kbd} as @code{@@code}. +@item example +Use the distinguishing font for @code{@@kbd} only in @code{@@example} +and similar environments. +@item example +(the default) Always use the distinguishing font for @code{@@kbd}. +@end table + +You can embed another @@-command inside the braces of an @code{@@kbd} +command. Here, for example, is the way to describe a command that +would be described more verbosely as ``press an @samp{r} and then +press the @key{RET} key'':@refill + +@example +@@kbd@{r @@key@{RET@}@} +@end example + +@noindent +This produces: @kbd{r @key{RET}} + +You also use the @code{@@kbd} command if you are spelling out the letters +you type; for example:@refill + +@example +To give the @@code@{logout@} command, +type the characters @@kbd@{l o g o u t @@key@{RET@}@}. +@end example + +@noindent +This produces: + +@quotation +To give the @code{logout} command, +type the characters @kbd{l o g o u t @key{RET}}. +@end quotation + +(Also, this example shows that you can add spaces for clarity. If you +really want to mention a space character as one of the characters of +input, write @kbd{@@key@{SPC@}} for it.)@refill + + +@node key, samp, kbd, Indicating +@comment node-name, next, previous, up +@subsection @code{@@key}@{@var{key-name}@} +@findex key + +Use the @code{@@key} command for the conventional name for a key on a +keyboard, as in:@refill + +@example +@@key@{RET@} +@end example + +You can use the @code{@@key} command within the argument of an +@code{@@kbd} command when the sequence of characters to be typed +includes one or more keys that are described by name.@refill + +@need 700 +For example, to produce @kbd{C-x @key{ESC}} you would type:@refill + +@example +@@kbd@{C-x @@key@{ESC@}@} +@end example + +Here is a list of the recommended names for keys: +@cindex Recommended names for keys +@cindex Keys, recommended names +@cindex Names recommended for keys +@cindex Abbreviations for keys + +@quotation +@table @t +@item SPC +Space +@item RET +Return +@item LFD +Linefeed (however, since most keyboards nowadays do not have a Linefeed key, +it might be better to call this character @kbd{C-j}. +@item TAB +Tab +@item BS +Backspace +@item ESC +Escape +@item DEL +Delete +@item SHIFT +Shift +@item CTRL +Control +@item META +Meta +@end table +@end quotation + +@cindex META key +There are subtleties to handling words like `meta' or `ctrl' that are +names of modifier keys. When mentioning a character in which the +modifier key is used, such as @kbd{Meta-a}, use the @code{@@kbd} command +alone; do not use the @code{@@key} command; but when you are referring +to the modifier key in isolation, use the @code{@@key} command. For +example, write @samp{@@kbd@{Meta-a@}} to produce @kbd{Meta-a} and +@samp{@@key@{META@}} to produce @key{META}. + +@c I don't think this is a good explanation. +@c I think it will puzzle readers more than it clarifies matters. -- rms. +@c In other words, use @code{@@kbd} for what you do, and use @code{@@key} +@c for what you talk about: ``Press @code{@@kbd@{M-a@}} to move point to +@c the beginning of the sentence. The @code{@@key@{META@}} key is often in +@c the lower left of the keyboard.''@refill + +@node samp, var, key, Indicating +@comment node-name, next, previous, up +@subsection @code{@@samp}@{@var{text}@} +@findex samp + +Use the @code{@@samp} command to indicate text that is a literal example +or `sample' of a sequence of characters in a file, string, pattern, etc. +Enclose the text in braces. The argument appears within single +quotation marks in both the Info file and the printed manual; in +addition, it is printed in a fixed-width font.@refill + +@example +To match @@samp@{foo@} at the end of the line, +use the regexp @@samp@{foo$@}. +@end example + +@noindent +produces + +@quotation +To match @samp{foo} at the end of the line, use the regexp +@samp{foo$}.@refill +@end quotation + +Any time you are referring to single characters, you should use +@code{@@samp} unless @code{@@kbd} or @code{@@key} is more appropriate. +Use @code{@@samp} for the names of command-line options (except in an +@code{@@table}, where @code{@@code} seems to read more easily). Also, +you may use @code{@@samp} for entire statements in C and for entire +shell commands---in this case, @code{@@samp} often looks better than +@code{@@code}. Basically, @code{@@samp} is a catchall for whatever is +not covered by @code{@@code}, @code{@@kbd}, or @code{@@key}.@refill + +Only include punctuation marks within braces if they are part of the +string you are specifying. Write punctuation marks outside the braces +if those punctuation marks are part of the English text that surrounds +the string. In the following sentence, for example, the commas and +period are outside of the braces:@refill + +@example +@group +In English, the vowels are @@samp@{a@}, @@samp@{e@}, +@@samp@{i@}, @@samp@{o@}, @@samp@{u@}, and sometimes +@@samp@{y@}. +@end group +@end example + +@noindent +This produces: + +@quotation +In English, the vowels are @samp{a}, @samp{e}, +@samp{i}, @samp{o}, @samp{u}, and sometimes +@samp{y}. +@end quotation + +@node var, file, samp, Indicating +@comment node-name, next, previous, up +@subsection @code{@@var}@{@var{metasyntactic-variable}@} +@findex var + +Use the @code{@@var} command to indicate metasyntactic variables. A +@dfn{metasyntactic variable} is something that stands for another piece of +text. For example, you should use a metasyntactic variable in the +documentation of a function to describe the arguments that are passed +to that function.@refill + +Do not use @code{@@var} for the names of particular variables in +programming languages. These are specific names from a program, so +@code{@@code} is correct for them. For example, the Emacs Lisp variable +@code{texinfo-tex-command} is not a metasyntactic variable; it is +properly formatted using @code{@@code}.@refill + +The effect of @code{@@var} in the Info file is to change the case of +the argument to all upper case; in the printed manual, to italicize it. + +@need 700 +For example, + +@example +To delete file @@var@{filename@}, +type @@code@{rm @@var@{filename@}@}. +@end example + +@noindent +produces + +@quotation +To delete file @var{filename}, type @code{rm @var{filename}}. +@end quotation + +@noindent +(Note that @code{@@var} may appear inside @code{@@code}, +@code{@@samp}, @code{@@file}, etc.)@refill + +Write a metasyntactic variable all in lower case without spaces, and +use hyphens to make it more readable. Thus, the Texinfo source for +the illustration of how to begin a Texinfo manual looks like +this:@refill + +@example +@group +\input texinfo +@@@@setfilename @@var@{info-file-name@} +@@@@settitle @@var@{name-of-manual@} +@end group +@end example + +@noindent +This produces: + +@example +@group +\input texinfo +@@setfilename @var{info-file-name} +@@settitle @var{name-of-manual} +@end group +@end example + +In some documentation styles, metasyntactic variables are shown with +angle brackets, for example:@refill + +@example +@dots{}, type rm <filename> +@end example + +@noindent +However, that is not the style that Texinfo uses. (You can, of +course, modify the sources to @TeX{} and the Info formatting commands +to output the @code{<@dots{}>} format if you wish.)@refill + +@node file, dfn, var, Indicating +@comment node-name, next, previous, up +@subsection @code{@@file}@{@var{file-name}@} +@findex file + +Use the @code{@@file} command to indicate text that is the name of a +file, buffer, or directory, or is the name of a node in Info. You can +also use the command for file name suffixes. Do not use @code{@@file} +for symbols in a programming language; use @code{@@code}. + +Currently, @code{@@file} is equivalent to @code{@@samp} in its effects. +For example,@refill + +@example +The @@file@{.el@} files are in +the @@file@{/usr/local/emacs/lisp@} directory. +@end example + +@noindent +produces + +@quotation +The @file{.el} files are in +the @file{/usr/local/emacs/lisp} directory. +@end quotation + +@node dfn, cite, file, Indicating +@comment node-name, next, previous, up +@subsection @code{@@dfn}@{@var{term}@} +@findex dfn + +Use the @code{@@dfn} command to identify the introductory or defining +use of a technical term. Use the command only in passages whose +purpose is to introduce a term which will be used again or which the +reader ought to know. Mere passing mention of a term for the first +time does not deserve @code{@@dfn}. The command generates italics in +the printed manual, and double quotation marks in the Info file. For +example:@refill + +@example +Getting rid of a file is called @@dfn@{deleting@} it. +@end example + +@noindent +produces + +@quotation +Getting rid of a file is called @dfn{deleting} it. +@end quotation + +As a general rule, a sentence containing the defining occurrence of a +term should be a definition of the term. The sentence does not need +to say explicitly that it is a definition, but it should contain the +information of a definition---it should make the meaning clear. + +@node cite, url, dfn, Indicating +@comment node-name, next, previous, up +@subsection @code{@@cite}@{@var{reference}@} +@findex cite + +Use the @code{@@cite} command for the name of a book that lacks a +companion Info file. The command produces italics in the printed +manual, and quotation marks in the Info file.@refill + +(If a book is written in Texinfo, it is better to use a cross reference +command since a reader can easily follow such a reference in Info. +@xref{xref, , @code{@@xref}}.)@refill + +@ignore +@c node ctrl, , cite, Indicating +@comment node-name, next, previous, up +@c subsection @code{@@ctrl}@{@var{ctrl-char}@} +@findex ctrl + +The @code{@@ctrl} command is seldom used. It describes an @sc{ascii} +control character by inserting the actual character into the Info +file. + +Usually, in Texinfo, you talk what you type as keyboard entry by +describing it with @code{@@kbd}: thus, @samp{@@kbd@{C-a@}} for +@kbd{C-a}. Use @code{@@kbd} in this way when talking about a control +character that is typed on the keyboard by the user. When talking +about a control character appearing in a file or a string, do not use +@code{@@kbd} since the control character is not typed. Also, do not +use @samp{C-} but spell out @code{control-}, as in @samp{control-a}, +to make it easier for a reader to understand.@refill + +@code{@@ctrl} is an idea from the beginnings of Texinfo which may not +really fit in to the scheme of things. But there may be times when +you want to use the command. The pattern is +@code{@@ctrl@{@var{ch}@}}, where @var{ch} is an @sc{ascii} character +whose control-equivalent is wanted. For example, to specify +@samp{control-f}, you would enter@refill + +@example +@@ctrl@{f@} +@end example + +@noindent +produces + +@quotation +@ctrl{f} +@end quotation + +In the Info file, this generates the specified control character, output +literally into the file. This is done so a user can copy the specified +control character (along with whatever else he or she wants) into another +Emacs buffer and use it. Since the `control-h',`control-i', and +`control-j' characters are formatting characters, they should not be +indicated with @code{@@ctrl}.@refill + +In a printed manual, @code{@@ctrl} generates text to describe or +identify that control character: an uparrow followed by the character +@var{ch}.@refill +@end ignore + + +@node url, email, cite, Indicating +@subsection @code{@@url}@{@var{uniform-resource-locator}@} +@findex url +@cindex Uniform resource locator, indicating +@cindex URL, indicating + +Use the @code{@@url} to indicate a uniform resource locator on the World +Wide Web. This is analogous to @code{@@file}, @code{@@var}, etc., and +is purely for markup purposes. It does not produce a link you can +follow in HTML output (the @code{@@uref} command does, @pxref{uref,, +@code{@@uref}}). It is useful for example URL's which do not actually +exist. For example: + +@c Two lines because one is too long for smallbook format. +@example +For example, the url might be +@@url@{http://host.domain.org/path@}. +@end example + + +@node email, , url, Indicating +@subsection @code{@@email}@{@var{email-address}[, @var{displayed-text}]@} +@findex email + +Use the @code{@@email} command to indicate an electronic mail address. +It takes one mandatory argument, the address, and one optional argument, the +text to display (the default is the address itself). + +@cindex mailto link +In Info and @TeX{}, the address is shown in angle brackets, preceded by +the text to display if any. In HTML output, @code{@@email} produces a +@samp{mailto} link that usually brings up a mail composition window. +For example: + +@example +Send bug reports to @@email@{bug-texinfo@@@@prep.ai.mit.edu@}. +Send suggestions to the @@email@{bug-texinfo@@@@prep.ai.mit.edu, same place@}. +@end example +@noindent produces +@example +Send bug reports to @email{bug-texinfo@@prep.ai.mit.edu}. +Send suggestions to the @email{bug-texinfo@@prep.ai.mit.edu, same place}. +@end example + + +@node Emphasis, , Indicating, Marking Text +@comment node-name, next, previous, up +@section Emphasizing Text +@cindex Emphasizing text + +Usually, Texinfo changes the font to mark words in the text according to +what category the words belong to; an example is the @code{@@code} command. +Most often, this is the best way to mark words. +However, sometimes you will want to emphasize text without indicating a +category. Texinfo has two commands to do this. Also, Texinfo has +several commands that specify the font in which @TeX{} will typeset +text. These commands have no affect on Info and only one of them, +the @code{@@r} command, has any regular use.@refill + +@menu +* emph & strong:: How to emphasize text in Texinfo. +* Smallcaps:: How to use the small caps font. +* Fonts:: Various font commands for printed output. +* Customized Highlighting:: How to define highlighting commands. +@end menu + +@node emph & strong, Smallcaps, Emphasis, Emphasis +@comment node-name, next, previous, up +@subsection @code{@@emph}@{@var{text}@} and @code{@@strong}@{@var{text}@} +@cindex Emphasizing text, font for +@findex emph +@findex strong + +The @code{@@emph} and @code{@@strong} commands are for emphasis; +@code{@@strong} is stronger. In printed output, @code{@@emph} +produces @emph{italics} and @code{@@strong} produces +@strong{bold}.@refill + +@need 800 +For example, + +@example +@group +@@quotation +@@strong@{Caution:@} @@samp@{rm * .[^.]*@} removes @@emph@{all@} +files in the directory. +@@end quotation +@end group +@end example + +@iftex +@noindent +produces the following in printed output: + +@quotation +@strong{Caution}: @code{rm * .[^.]*} removes @emph{all} +files in the directory. +@end quotation + +@noindent +and the following in Info: +@end iftex +@ifinfo +@noindent +produces: +@end ifinfo + +@example + *Caution*: `rm * .[^.]*' removes *all* + files in the directory. +@end example + +The @code{@@strong} command is seldom used except to mark what is, in +effect, a typographical element, such as the word `Caution' in the +preceding example. + +In the Info file, both @code{@@emph} and @code{@@strong} put asterisks +around the text.@refill + +@quotation +@strong{Caution:} Do not use @code{@@emph} or @code{@@strong} with the +word @samp{Note}; Info will mistake the combination for a cross +reference. Use a phrase such as @strong{Please note} or +@strong{Caution} instead.@refill +@end quotation + +@node Smallcaps, Fonts, emph & strong, Emphasis +@subsection @code{@@sc}@{@var{text}@}: The Small Caps Font +@cindex Small caps font +@findex sc @r{(small caps font)} + +@iftex +Use the @samp{@@sc} command to set text in the printed output in @sc{a +small caps font} and set text in the Info file in upper case letters.@refill +@end iftex +@ifinfo +Use the @samp{@@sc} command to set text in the printed output in a +small caps font and set text in the Info file in upper case letters.@refill +@end ifinfo + +Write the text between braces in lower case, like this:@refill + +@example +The @@sc@{acm@} and @@sc@{ieee@} are technical societies. +@end example + +@noindent +This produces: + +@display +The @sc{acm} and @sc{ieee} are technical societies. +@end display + +@TeX{} typesets the small caps font in a manner that prevents the +letters from `jumping out at you on the page'. This makes small caps +text easier to read than text in all upper case. The Info formatting +commands set all small caps text in upper case.@refill + +@ifinfo +If the text between the braces of an @code{@@sc} command is upper case, +@TeX{} typesets in full-size capitals. Use full-size capitals +sparingly.@refill +@end ifinfo +@iftex +If the text between the braces of an @code{@@sc} command is upper case, +@TeX{} typesets in @sc{FULL-SIZE CAPITALS}. Use full-size capitals +sparingly.@refill +@end iftex + +You may also use the small caps font for a jargon word such as +@sc{ato} (a @sc{nasa} word meaning `abort to orbit').@refill + +There are subtleties to using the small caps font with a jargon word +such as @sc{cdr}, a word used in Lisp programming. In this case, you +should use the small caps font when the word refers to the second and +subsequent elements of a list (the @sc{cdr} of the list), but you +should use @samp{@@code} when the word refers to the Lisp function of +the same spelling.@refill + +@node Fonts, Customized Highlighting, Smallcaps, Emphasis +@comment node-name, next, previous, up +@subsection Fonts for Printing, Not Info +@cindex Fonts for printing, not for Info +@findex i @r{(italic font)} +@findex b @r{(bold font)} +@findex t @r{(typewriter font)} +@findex r @r{(Roman font)} + +Texinfo provides four font commands that specify font changes in the +printed manual but have no effect in the Info file. @code{@@i} +requests @i{italic} font (in some versions of @TeX{}, a slanted font +is used), @code{@@b} requests @b{bold} face, @code{@@t} requests the +@t{fixed-width}, typewriter-style font used by @code{@@code}, and @code{@@r} requests a +@r{roman} font, which is the usual font in which text is printed. All +four commands apply to an argument that follows, surrounded by +braces.@refill + +Only the @code{@@r} command has much use: in example programs, you +can use the @code{@@r} command to convert code comments from the +fixed-width font to a roman font. This looks better in printed +output.@refill + +@need 700 +For example, + +@example +@group +@@lisp +(+ 2 2) ; @@r@{Add two plus two.@} +@@end lisp +@end group +@end example + +@noindent +produces + +@lisp +(+ 2 2) ; @r{Add two plus two.} +@end lisp + +If possible, you should avoid using the other three font commands. If +you need to use one, it probably indicates a gap in the Texinfo +language.@refill + +@node Customized Highlighting, , Fonts, Emphasis +@comment node-name, next, previous, up +@subsection Customized Highlighting +@cindex Highlighting, customized +@cindex Customized highlighting + +@c I think this whole section is obsolete with the advent of macros +@c --karl, 15sep96. +You can use regular @TeX{} commands inside of @code{@@iftex} @dots{} +@code{@@end iftex} to create your own customized highlighting commands +for Texinfo. The easiest way to do this is to equate your customized +commands with pre-existing commands, such as those for italics. Such +new commands work only with @TeX{}.@refill + +@findex definfoenclose +@cindex Enclosure command for Info +You can use the @code{@@definfoenclose} command inside of +@code{@@ifinfo} @dots{} @code{@@end ifinfo} to define commands for Info +with the same names as new commands for @TeX{}. +@code{@@definfoenclose} creates new commands for Info that mark text by +enclosing it in strings that precede and follow the text. +@footnote{Currently, @code{@@definfoenclose} works only with +@code{texinfo-format-buffer} and @code{texinfo-format-region}, not with +@code{makeinfo}.}@refill + +Here is how to create a new @@-command called @code{@@phoo} that causes +@TeX{} to typeset its argument in italics and causes Info to display the +argument between @samp{//} and @samp{\\}.@refill + +@need 1300 +For @TeX{}, write the following to equate the @code{@@phoo} command with +the existing @code{@@i} italics command:@refill + +@example +@group +@@iftex +@@global@@let@@phoo=@@i +@@end iftex +@end group +@end example + +@noindent +This defines @code{@@phoo} as a command that causes @TeX{} to typeset +the argument to @code{@@phoo} in italics. @code{@@global@@let} tells +@TeX{} to equate the next argument with the argument that follows the +equals sign. + +@need 1300 +For Info, write the following to tell the Info formatters to enclose the +argument between @samp{//} and @samp{\\}: + +@example +@group +@@ifinfo +@@definfoenclose phoo, //, \\ +@@end ifinfo +@end group +@end example + +@noindent +Write the @code{@@definfoenclose} command on a line and follow it with +three arguments separated by commas (commas are used as separators in an +@code{@@node} line in the same way).@refill + +@itemize @bullet +@item +The first argument to @code{@@definfoenclose} is the @@-command name +@strong{without} the @samp{@@}; + +@item +the second argument is the Info start delimiter string; and, + +@item +the third argument is the Info end delimiter string. +@end itemize + +@noindent +The latter two arguments enclose the highlighted text in the Info file. +A delimiter string may contain spaces. Neither the start nor end +delimiter is required. However, if you do not provide a start +delimiter, you must follow the command name with two commas in a row; +otherwise, the Info formatting commands will misinterpret the end +delimiter string as a start delimiter string.@refill + +After you have defined @code{@@phoo} both for @TeX{} and for Info, you +can then write @code{@@phoo@{bar@}} to see @samp{//bar\\} +in Info and see +@ifinfo +@samp{bar} in italics in printed output. +@end ifinfo +@iftex +@i{bar} in italics in printed output. +@end iftex + +Note that each definition applies to its own formatter: one for @TeX{}, +the other for Info. + +@need 1200 +Here is another example: + +@example +@group +@@ifinfo +@@definfoenclose headword, , : +@@end ifinfo +@@iftex +@@global@@let@@headword=@@b +@@end iftex +@end group +@end example + +@noindent +This defines @code{@@headword} as an Info formatting command that +inserts nothing before and a colon after the argument and as a @TeX{} +formatting command to typeset its argument in bold. + +@node Quotations and Examples, Lists and Tables, Marking Text, Top +@comment node-name, next, previous, up +@chapter Quotations and Examples + +Quotations and examples are blocks of text consisting of one or more +whole paragraphs that are set off from the bulk of the text and +treated differently. They are usually indented.@refill + +In Texinfo, you always begin a quotation or example by writing an +@@-command at the beginning of a line by itself, and end it by writing +an @code{@@end} command that is also at the beginning of a line by +itself. For instance, you begin an example by writing @code{@@example} +by itself at the beginning of a line and end the example by writing +@code{@@end example} on a line by itself, at the beginning of that +line.@refill +@findex end + +@menu +* Block Enclosing Commands:: Use different constructs for + different purposes. +* quotation:: How to write a quotation. +* example:: How to write an example in a fixed-width font. +* noindent:: How to prevent paragraph indentation. +* Lisp Example:: How to illustrate Lisp code. +* smallexample & smalllisp:: Forms for the @code{@@smallbook} option. +* display:: How to write an example in the current font. +* format:: How to write an example that does not narrow + the margins. +* exdent:: How to undo the indentation of a line. +* flushleft & flushright:: How to push text flushleft or flushright. +* cartouche:: How to draw cartouches around examples. +@end menu + +@node Block Enclosing Commands, quotation, Quotations and Examples, Quotations and Examples +@section The Block Enclosing Commands + +Here are commands for quotations and examples:@refill + +@table @code +@item @@quotation +Indicate text that is quoted. The text is filled, indented, and +printed in a roman font by default.@refill + +@item @@example +Illustrate code, commands, and the like. The text is printed +in a fixed-width font, and indented but not filled.@refill + +@item @@lisp +Illustrate Lisp code. The text is printed in a fixed-width font, +and indented but not filled.@refill + +@item @@smallexample +Illustrate code, commands, and the like. Similar to +@code{@@example}, except that in @TeX{} this command typesets text in +a smaller font for the smaller @code{@@smallbook} format than for the +8.5 by 11 inch format.@refill + +@item @@smalllisp +Illustrate Lisp code. Similar to @code{@@lisp}, except that +in @TeX{} this command typesets text in a smaller font for the smaller +@code{@@smallbook} format than for the 8.5 by 11 inch format.@refill + +@item @@display +Display illustrative text. The text is indented but not filled, and +no font is specified (so, by default, the font is roman).@refill + +@item @@format +Print illustrative text. The text is not indented and not filled +and no font is specified (so, by default, the font is roman).@refill +@end table + +The @code{@@exdent} command is used within the above constructs to +undo the indentation of a line. + +The @code{@@flushleft} and @code{@@flushright} commands are used to line +up the left or right margins of unfilled text.@refill + +The @code{@@noindent} command may be used after one of the above +constructs to prevent the following text from being indented as a new +paragraph.@refill + +You can use the @code{@@cartouche} command within one of the above +constructs to highlight the example or quotation by drawing a box with +rounded corners around it. (The @code{@@cartouche} command affects +only the printed manual; it has no effect in the Info file; see +@ref{cartouche, , Drawing Cartouches Around Examples}.)@refill + +@node quotation, example, Block Enclosing Commands, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@quotation} +@cindex Quotations +@findex quotation + +The text of a quotation is +processed normally except that:@refill + +@itemize @bullet +@item +the margins are closer to the center of the page, so the whole of the +quotation is indented;@refill + +@item +the first lines of paragraphs are indented no more than other +lines;@refill + +@item +in the printed output, interparagraph spacing is reduced.@refill +@end itemize + +@quotation +This is an example of text written between an @code{@@quotation} +command and an @code{@@end quotation} command. An @code{@@quotation} +command is most often used to indicate text that is excerpted from +another (real or hypothetical) printed work.@refill +@end quotation + +Write an @code{@@quotation} command as text on a line by itself. This +line will disappear from the output. Mark the end of the quotation +with a line beginning with and containing only @code{@@end quotation}. +The @code{@@end quotation} line will likewise disappear from the +output. Thus, the following,@refill + +@example +@@quotation +This is +a foo. +@@end quotation +@end example + +@noindent +produces + +@quotation +This is a foo. +@end quotation + +@node example, noindent, quotation, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@example} +@cindex Examples, formatting them +@cindex Formatting examples +@findex example + +The @code{@@example} command is used to indicate an example that is +not part of the running text, such as computer input or output.@refill + +@example +@group +This is an example of text written between an +@code{@@example} command +and an @code{@@end example} command. +The text is indented but not filled. +@end group + +@group +In the printed manual, the text is typeset in a +fixed-width font, and extra spaces and blank lines are +significant. In the Info file, an analogous result is +obtained by indenting each line with five spaces. +@end group +@end example + +Write an @code{@@example} command at the beginning of a line by itself. +This line will disappear from the output. Mark the end of the example +with an @code{@@end example} command, also written at the beginning of a +line by itself. The @code{@@end example} will disappear from the +output.@refill + +@need 700 +For example, + +@example +@@example +mv foo bar +@@end example +@end example + +@noindent +produces + +@example +mv foo bar +@end example + +Since the lines containing @code{@@example} and @code{@@end example} +will disappear, you should put a blank line before the +@code{@@example} and another blank line after the @code{@@end +example}. (Remember that blank lines between the beginning +@code{@@example} and the ending @code{@@end example} will appear in +the output.)@refill + +@quotation +@strong{Caution:} Do not use tabs in the lines of an example (or anywhere +else in Texinfo, for that matter)! @TeX{} treats tabs as single +spaces, and that is not what they look like. This is a problem with +@TeX{}. (If necessary, in Emacs, you can use @kbd{M-x untabify} to +convert tabs in a region to multiple spaces.)@refill +@end quotation + +Examples are often, logically speaking, ``in the middle'' of a +paragraph, and the text continues after an example should not be +indented. The @code{@@noindent} command prevents a piece of text from +being indented as if it were a new paragraph. +@ifinfo +(@xref{noindent}.) +@end ifinfo + +(The @code{@@code} command is used for examples of code that are +embedded within sentences, not set off from preceding and following +text. @xref{code, , @code{@@code}}.) + +@node noindent, Lisp Example, example, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@noindent} +@findex noindent + +An example or other inclusion can break a paragraph into segments. +Ordinarily, the formatters indent text that follows an example as a new +paragraph. However, you can prevent this by writing @code{@@noindent} +at the beginning of a line by itself preceding the continuation +text.@refill + +@need 1500 +For example: + +@example +@group +@@example +This is an example +@@end example + +@@noindent +This line is not indented. As you can see, the +beginning of the line is fully flush left with the line +that follows after it. (This whole example is between +@@code@{@@@@display@} and @@code@{@@@@end display@}.) +@end group +@end example + +@noindent +produces + +@display +@example +This is an example +@end example +@tex +% Remove extra vskip; this is a kludge to counter the effect of display +\vskip-3.5\baselineskip +@end tex + +@noindent +This line is not indented. As you can see, the +beginning of the line is fully flush left with the line +that follows after it. (This whole example is between +@code{@@display} and @code{@@end display}.) +@end display + +To adjust the number of blank lines properly in the Info file output, +remember that the line containing @code{@@noindent} does not generate a +blank line, and neither does the @code{@@end example} line.@refill + +In the Texinfo source file for this manual, each line that says +`produces' is preceded by a line containing @code{@@noindent}.@refill + +Do not put braces after an @code{@@noindent} command; they are not +necessary, since @code{@@noindent} is a command used outside of +paragraphs (@pxref{Command Syntax}).@refill + +@node Lisp Example, smallexample & smalllisp, noindent, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@lisp} +@cindex Lisp example +@findex lisp + +The @code{@@lisp} command is used for Lisp code. It is synonymous +with the @code{@@example} command. + +@lisp +This is an example of text written between an +@code{@@lisp} command and an @code{@@end lisp} command. +@end lisp + +Use @code{@@lisp} instead of @code{@@example} to preserve information +regarding the nature of the example. This is useful, for example, if +you write a function that evaluates only and all the Lisp code in a +Texinfo file. Then you can use the Texinfo file as a Lisp +library.@footnote{It would be straightforward to extend Texinfo to work +in a similar fashion for C, Fortran, or other languages.}@refill + +Mark the end of @code{@@lisp} with @code{@@end lisp} on a line by +itself.@refill + +@node smallexample & smalllisp, display, Lisp Example, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@smallexample} and @code{@@smalllisp} +@cindex Small book example +@cindex Example for a small book +@cindex Lisp example for a small book +@findex smallexample +@findex smalllisp + +In addition to the regular @code{@@example} and @code{@@lisp} commands, +Texinfo has two other ``example-style'' commands. These are the +@code{@@smallexample} and @code{@@smalllisp} commands. Both these +commands are designed for use with the @code{@@smallbook} command that +causes @TeX{} to produce a printed manual in a 7 by 9.25 inch format +rather than the regular 8.5 by 11 inch format.@refill + +In @TeX{}, the @code{@@smallexample} and @code{@@smalllisp} commands +typeset text in a smaller font for the smaller @code{@@smallbook} +format than for the 8.5 by 11 inch format. Consequently, many examples +containing long lines fit in a narrower, @code{@@smallbook} page +without needing to be shortened. Both commands typeset in the normal +font size when you format for the 8.5 by 11 inch size; indeed, +in this situation, the @code{@@smallexample} and @code{@@smalllisp} +commands are defined to be the @code{@@example} and @code{@@lisp} +commands.@refill + +In Info, the @code{@@smallexample} and @code{@@smalllisp} commands are +equivalent to the @code{@@example} and @code{@@lisp} commands, and work +exactly the same.@refill + +Mark the end of @code{@@smallexample} or @code{@@smalllisp} with +@code{@@end smallexample} or @code{@@end smalllisp}, +respectively.@refill + +@iftex +Here is an example written in the small font used by the +@code{@@smallexample} and @code{@@smalllisp} commands: + +@ifclear smallbook +@display +@tex +% Remove extra vskip; this is a kludge to counter the effect of display +\vskip-3\baselineskip +{\ninett +\dots{} to make sure that you have the freedom to +distribute copies of free software (and charge for +this service if you wish), that you receive source +code or can get it if you want it, that you can +change the software or use pieces of it in new free +programs; and that you know you can do these things.} +@end tex +@end display +@end ifclear +@end iftex +@ifset smallbook +@iftex +@smallexample +This is an example of text written between @code{@@smallexample} and +@code{@@end smallexample}. In Info and in an 8.5 by 11 inch manual, +this text appears in its normal size; but in a 7 by 9.25 inch manual, +this text appears in a smaller font. +@end smallexample +@end iftex +@end ifset +@ifinfo +@smallexample +This is an example of text written between @code{@@smallexample} and +@code{@@end smallexample}. In Info and in an 8.5 by 11 inch manual, +this text appears in its normal size; but in a 7 by 9.25 inch manual, +this text appears in a smaller font. +@end smallexample +@end ifinfo + +The @code{@@smallexample} and @code{@@smalllisp} commands make it +easier to prepare smaller format manuals without forcing you to edit +examples by hand to fit them onto narrower pages.@refill + +As a general rule, a printed document looks better if you write all the +examples in a chapter consistently in @code{@@example} or in +@code{@@smallexample}. Only occasionally should you mix the two +formats.@refill + +@xref{smallbook, , Printing ``Small'' Books}, for more information +about the @code{@@smallbook} command.@refill + +@node display, format, smallexample & smalllisp, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@display} +@cindex Display formatting +@findex display + +The @code{@@display} command begins a kind of example. It is like the +@code{@@example} command +except that, in +a printed manual, @code{@@display} does not select the fixed-width +font. In fact, it does not specify the font at all, so that the text +appears in the same font it would have appeared in without the +@code{@@display} command.@refill + +@display +This is an example of text written between an @code{@@display} command +and an @code{@@end display} command. The @code{@@display} command +indents the text, but does not fill it. +@end display + +@node format, exdent, display, Quotations and Examples +@comment node-name, next, previous, up +@section @code{@@format} +@findex format + +The @code{@@format} command is similar to @code{@@example} except +that, in the printed manual, @code{@@format} does not select the +fixed-width font and does not narrow the margins.@refill + +@format +This is an example of text written between an @code{@@format} command +and an @code{@@end format} command. As you can see +from this example, +the @code{@@format} command does not fill the text. +@end format + +@node exdent, flushleft & flushright, format, Quotations and Examples +@section @code{@@exdent}: Undoing a Line's Indentation +@cindex Indentation undoing +@findex exdent + +The @code{@@exdent} command removes any indentation a line might have. +The command is written at the beginning of a line and applies only to +the text that follows the command that is on the same line. Do not use +braces around the text. In a printed manual, the text on an +@code{@@exdent} line is printed in the roman font.@refill + +@code{@@exdent} is usually used within examples. Thus,@refill + +@example +@group +@@example +This line follows an @@@@example command. +@@exdent This line is exdented. +This line follows the exdented line. +The @@@@end example comes on the next line. +@@end group +@end group +@end example + +@noindent +produces + +@example +@group +This line follows an @@example command. +@exdent This line is exdented. +This line follows the exdented line. +The @@end example comes on the next line. +@end group +@end example + +In practice, the @code{@@exdent} command is rarely used. +Usually, you un-indent text by ending the example and +returning the page to its normal width.@refill + +@node flushleft & flushright, cartouche, exdent, Quotations and Examples +@section @code{@@flushleft} and @code{@@flushright} +@findex flushleft +@findex flushright + +The @code{@@flushleft} and @code{@@flushright} commands line up the +ends of lines on the left and right margins of a page, +but do not fill the text. The commands are written on lines of their +own, without braces. The @code{@@flushleft} and @code{@@flushright} +commands are ended by @code{@@end flushleft} and @code{@@end +flushright} commands on lines of their own.@refill + +@need 1500 +For example, + +@example +@group +@@flushleft +This text is +written flushleft. +@@end flushleft +@end group +@end example + +@noindent +produces + +@quotation +@flushleft +This text is +written flushleft. +@end flushleft +@end quotation + + +@code{@@flushright} produces the type of indentation often used in the +return address of letters. For example, + +@example +@group +@@flushright +Here is an example of text written +flushright. The @@code@{@@flushright@} command +right justifies every line but leaves the +left end ragged. +@@end flushright +@end group +@end example + +@noindent +produces + +@flushright +Here is an example of text written +flushright. The @code{@@flushright} command +right justifies every line but leaves the +left end ragged. +@end flushright + +@node cartouche, , flushleft & flushright, Quotations and Examples +@section Drawing Cartouches Around Examples +@findex cartouche +@cindex Box with rounded corners + +In a printed manual, the @code{@@cartouche} command draws a box with +rounded corners around its contents. You can use this command to +further highlight an example or quotation. For instance, you could +write a manual in which one type of example is surrounded by a cartouche +for emphasis.@refill + +The @code{@@cartouche} command affects only the printed manual; it has +no effect in the Info file.@refill + +@need 1500 +For example, + +@example +@group +@@example +@@cartouche +% pwd +/usr/local/share/emacs +@@end cartouche +@@end example +@end group +@end example + +@noindent +surrounds the two-line example with a box with rounded corners, in the +printed manual. + +@iftex +In a printed manual, the example looks like this:@refill + +@example +@group +@cartouche +% pwd +/usr/local/lib/emacs/info +@end cartouche +@end group +@end example +@end iftex + + +@node Lists and Tables, Indices, Quotations and Examples, Top +@chapter Lists and Tables +@cindex Making lists and tables +@cindex Lists and tables, making +@cindex Tables and lists, making + +Texinfo has several ways of making lists and tables. Lists can be +bulleted or numbered; two-column tables can highlight the items in +the first column; multi-column tables are also supported. + +@menu +* Introducing Lists:: Texinfo formats lists for you. +* itemize:: How to construct a simple list. +* enumerate:: How to construct a numbered list. +* Two-column Tables:: How to construct a two-column table. +* Multi-column Tables:: How to construct generalized tables. +@end menu + +@ifinfo +@node Introducing Lists, itemize, Lists and Tables, Lists and Tables +@heading Introducing Lists +@end ifinfo + +Texinfo automatically indents the text in lists or tables, and numbers +an enumerated list. This last feature is useful if you modify the +list, since you do not need to renumber it yourself.@refill + +Numbered lists and tables begin with the appropriate @@-command at the +beginning of a line, and end with the corresponding @code{@@end} +command on a line by itself. The table and itemized-list commands +also require that you write formatting information on the same line as +the beginning @@-command.@refill + +Begin an enumerated list, for example, with an @code{@@enumerate} +command and end the list with an @code{@@end enumerate} command. +Begin an itemized list with an @code{@@itemize} command, followed on +the same line by a formatting command such as @code{@@bullet}, and end +the list with an @code{@@end itemize} command.@refill +@findex end + +Precede each element of a list with an @code{@@item} or @code{@@itemx} +command.@refill + +@sp 1 +@noindent +Here is an itemized list of the different kinds of table and lists:@refill + +@itemize @bullet +@item +Itemized lists with and without bullets. + +@item +Enumerated lists, using numbers or letters. + +@item +Two-column tables with highlighting. +@end itemize + +@sp 1 +@noindent +Here is an enumerated list with the same items:@refill + +@enumerate +@item +Itemized lists with and without bullets. + +@item +Enumerated lists, using numbers or letters. + +@item +Two-column tables with highlighting. +@end enumerate + +@sp 1 +@noindent +And here is a two-column table with the same items and their +@w{@@-commands}:@refill + +@table @code +@item @@itemize +Itemized lists with and without bullets. + +@item @@enumerate +Enumerated lists, using numbers or letters. + +@item @@table +@itemx @@ftable +@itemx @@vtable +Two-column tables with indexing. +@end table + +@node itemize, enumerate, Introducing Lists, Lists and Tables +@comment node-name, next, previous, up +@section Making an Itemized List +@cindex Itemization +@findex itemize + +The @code{@@itemize} command produces sequences of indented +paragraphs, with a bullet or other mark inside the left margin +at the beginning of each paragraph for which such a mark is desired.@refill + +Begin an itemized list by writing @code{@@itemize} at the beginning of +a line. Follow the command, on the same line, with a character or a +Texinfo command that generates a mark. Usually, you will write +@code{@@bullet} after @code{@@itemize}, but you can use +@code{@@minus}, or any character or any special symbol that results in +a single character in the Info file. (When you write @code{@@bullet} +or @code{@@minus} after an @code{@@itemize} command, you may omit the +@samp{@{@}}.)@refill + +Write the text of the indented paragraphs themselves after the +@code{@@itemize}, up to another line that says @code{@@end +itemize}.@refill + +Before each paragraph for which a mark in the margin is desired, write +a line that says just @code{@@item}. Do not write any other text on this +line.@refill +@findex item + +Usually, you should put a blank line before an @code{@@item}. This +puts a blank line in the Info file. (@TeX{} inserts the proper +interline whitespace in either case.) Except when the entries are +very brief, these blank lines make the list look better.@refill + +Here is an example of the use of @code{@@itemize}, followed by the +output it produces. Note that @code{@@bullet} produces an @samp{*} in +Info and a round dot in @TeX{}.@refill + +@example +@group +@@itemize @@bullet +@@item +Some text for foo. + +@@item +Some text +for bar. +@@end itemize +@end group +@end example + +@noindent +This produces: + +@quotation +@itemize @bullet +@item +Some text for foo. + +@item +Some text +for bar. +@end itemize +@end quotation + +Itemized lists may be embedded within other itemized lists. Here is a +list marked with dashes embedded in a list marked with bullets:@refill + +@example +@group +@@itemize @@bullet +@@item +First item. + +@@itemize @@minus +@@item +Inner item. + +@@item +Second inner item. +@@end itemize + +@@item +Second outer item. +@@end itemize +@end group +@end example + +@noindent +This produces: + +@quotation +@itemize @bullet +@item +First item. + +@itemize @minus +@item +Inner item. + +@item +Second inner item. +@end itemize + +@item +Second outer item. +@end itemize +@end quotation + +@node enumerate, Two-column Tables, itemize, Lists and Tables +@comment node-name, next, previous, up +@section Making a Numbered or Lettered List +@cindex Enumeration +@findex enumerate + +@code{@@enumerate} is like @code{@@itemize} (@pxref{itemize,, +@code{@@itemize}}), except that the labels on the items are +successive integers or letters instead of bullets. + +Write the @code{@@enumerate} command at the beginning of a line. The +command does not require an argument, but accepts either a number or a +letter as an option. Without an argument, @code{@@enumerate} starts the +list with the number @samp{1}. With a numeric argument, such as +@samp{3}, the command starts the list with that number. With an upper +or lower case letter, such as @samp{a} or @samp{A}, the command starts +the list with that letter.@refill + +Write the text of the enumerated list in the same way you write an +itemized list: put @code{@@item} on a line of its own before the start +of each paragraph that you want enumerated. Do not write any other text +on the line beginning with @code{@@item}.@refill + +You should put a blank line between entries in the list. +This generally makes it easier to read the Info file.@refill + +@need 1500 +Here is an example of @code{@@enumerate} without an argument:@refill + +@example +@group +@@enumerate +@@item +Underlying causes. + +@@item +Proximate causes. +@@end enumerate +@end group +@end example + +@noindent +This produces: + +@enumerate +@item +Underlying causes. + +@item +Proximate causes. +@end enumerate +@sp 1 +Here is an example with an argument of @kbd{3}:@refill +@sp 1 +@example +@group +@@enumerate 3 +@@item +Predisposing causes. + +@@item +Precipitating causes. + +@@item +Perpetuating causes. +@@end enumerate +@end group +@end example + +@noindent +This produces: + +@enumerate 3 +@item +Predisposing causes. + +@item +Precipitating causes. + +@item +Perpetuating causes. +@end enumerate +@sp 1 +Here is a brief summary of the alternatives. The summary is constructed +using @code{@@enumerate} with an argument of @kbd{a}.@refill +@sp 1 +@enumerate a +@item +@code{@@enumerate} + +Without an argument, produce a numbered list, starting with the number +1.@refill + +@item +@code{@@enumerate @var{positive-integer}} + +With a (positive) numeric argument, start a numbered list with that +number. You can use this to continue a list that you interrupted with +other text.@refill + +@item +@code{@@enumerate @var{upper-case-letter}} + +With an upper case letter as argument, start a list +in which each item is marked +by a letter, beginning with that upper case letter.@refill + +@item +@code{@@enumerate @var{lower-case-letter}} + +With a lower case letter as argument, start a list +in which each item is marked by +a letter, beginning with that lower case letter.@refill +@end enumerate + +You can also nest enumerated lists, as in an outline.@refill + +@node Two-column Tables, Multi-column Tables, enumerate, Lists and Tables +@section Making a Two-column Table +@cindex Tables, making two-column +@findex table + +@code{@@table} is similar to @code{@@itemize} (@pxref{itemize,, +@code{@@itemize}}), but allows you to specify a name or heading line for +each item. The @code{@@table} command is used to produce two-column +tables, and is especially useful for glossaries, explanatory +exhibits, and command-line option summaries. + +@menu +* table:: How to construct a two-column table. +* ftable vtable:: Automatic indexing for two-column tables. +* itemx:: How to put more entries in the first column. +@end menu + +@ifinfo +@node table, ftable vtable, Two-column Tables, Two-column Tables +@subheading Using the @code{@@table} Command + +Use the @code{@@table} command to produce two-column tables.@refill +@end ifinfo + +Write the @code{@@table} command at the beginning of a line and follow +it on the same line with an argument that is a Texinfo ``indicating'' +command such as @code{@@code}, @code{@@samp}, @code{@@var}, or +@code{@@kbd} (@pxref{Indicating}). Although these commands are usually +followed by arguments in braces, in this case you use the command name +without an argument because @code{@@item} will supply the argument. +This command will be applied to the text that goes into the first column +of each item and determines how it will be highlighted. For example, +@code{@@code} will cause the text in the first column to be highlighted +with an @code{@@code} command. (We recommend @code{@@code} for +@code{@@table}'s of command-line options.) + +@findex asis +You may also choose to use the @code{@@asis} command as an argument to +@code{@@table}. @code{@@asis} is a command that does nothing; if you +use this command after @code{@@table}, @TeX{} and the Info formatting +commands output the first column entries without added highlighting +(``as is'').@refill + +(The @code{@@table} command may work with other commands besides those +listed here. However, you can only use commands that normally take +arguments in braces.)@refill + +Begin each table entry with an @code{@@item} command at the beginning +of a line. Write the first column text on the same line as the +@code{@@item} command. Write the second column text on the line +following the @code{@@item} line and on subsequent lines. (You do not +need to type anything for an empty second column entry.) You may +write as many lines of supporting text as you wish, even several +paragraphs. But only text on the same line as the @code{@@item} will +be placed in the first column.@refill +@findex item + +Normally, you should put a blank line before an @code{@@item} line. +This puts a blank like in the Info file. Except when the entries are +very brief, a blank line looks better.@refill + +@need 1500 +The following table, for example, highlights the text in the first +column with an @code{@@samp} command:@refill + +@example +@group +@@table @@samp +@@item foo +This is the text for +@@samp@{foo@}. + +@@item bar +Text for @@samp@{bar@}. +@@end table +@end group +@end example + +@noindent +This produces: + +@table @samp +@item foo +This is the text for +@samp{foo}. +@item bar +Text for @samp{bar}. +@end table + +If you want to list two or more named items with a single block of +text, use the @code{@@itemx} command. (@xref{itemx, , +@code{@@itemx}}.)@refill + +@node ftable vtable, itemx, table, Two-column Tables +@comment node-name, next, previous, up +@subsection @code{@@ftable} and @code{@@vtable} +@cindex Tables with indexes +@cindex Indexing table entries automatically +@findex ftable +@findex vtable + +The @code{@@ftable} and @code{@@vtable} commands are the same as the +@code{@@table} command except that @code{@@ftable} automatically enters +each of the items in the first column of the table into the index of +functions and @code{@@vtable} automatically enters each of the items in +the first column of the table into the index of variables. This +simplifies the task of creating indices. Only the items on the same +line as the @code{@@item} commands are indexed, and they are indexed in +exactly the form that they appear on that line. @xref{Indices, , +Creating Indices}, for more information about indices.@refill + +Begin a two-column table using @code{@@ftable} or @code{@@vtable} by +writing the @@-command at the beginning of a line, followed on the same +line by an argument that is a Texinfo command such as @code{@@code}, +exactly as you would for an @code{@@table} command; and end the table +with an @code{@@end ftable} or @code{@@end vtable} command on a line by +itself. + +See the example for @code{@@table} in the previous section. + +@node itemx, , ftable vtable, Two-column Tables +@comment node-name, next, previous, up +@subsection @code{@@itemx} +@cindex Two named items for @code{@@table} +@findex itemx + +Use the @code{@@itemx} command inside a table when you have two or more +first column entries for the same item, each of which should appear on a +line of its own. Use @code{@@itemx} for all but the first entry; +@code{@@itemx} should always follow an @code{@@item} command. The +@code{@@itemx} command works exactly like @code{@@item} except that it +does not generate extra vertical space above the first column text. + +@need 1000 +For example, + +@example +@group +@@table @@code +@@item upcase +@@itemx downcase +These two functions accept a character or a string as +argument, and return the corresponding upper case (lower +case) character or string. +@@end table +@end group +@end example + +@noindent +This produces: + +@table @code +@item upcase +@itemx downcase +These two functions accept a character or a string as +argument, and return the corresponding upper case (lower +case) character or string.@refill +@end table + +@noindent +(Note also that this example illustrates multi-line supporting text in +a two-column table.)@refill + + +@node Multi-column Tables, , Two-column Tables, Lists and Tables +@section Multi-column Tables +@cindex Tables, making multi-column +@findex multitable + +@code{@@multitable} allows you to construct tables with any number of +columns, with each column having any width you like. + +You define the column widths on the @code{@@multitable} line itself, and +write each row of the actual table following an @code{@@item} command, +with columns separated by an @code{@@tab} command. Finally, @code{@@end +multitable} completes the table. Details in the sections below. + +@menu +* Multitable Column Widths:: Defining multitable column widths. +* Multitable Rows:: Defining multitable rows, with examples. +@end menu + +@node Multitable Column Widths, Multitable Rows, Multi-column Tables, Multi-column Tables +@subsection Multitable Column Widths +@cindex Multitable column widths +@cindex Column widths, defining for multitables +@cindex Widths, defining multitable column + +You can define the column widths for a multitable in two ways: as +fractions of the line length; or with a prototype row. Mixing the two +methods is not supported. In either case, the widths are defined +entirely on the same line as the @code{@@multitable} command. + +@enumerate +@item +@findex columnfractions +@cindex Line length, column widths as fraction of +To specify column widths as fractions of the line length, write +@code{@@columnfractions} and the decimal numbers (presumably less than +1) after the @code{@@multitable} command, as in: + +@example +@@multitable @@columnfractions .33 .33 .33 +@end example + +@noindent The fractions need not add up exactly to 1.0, as these do +not. This allows you to produce tables that do not need the full line +length. + +@item +@cindex Prototype row, column widths defined by +To specify a prototype row, write the longest entry for each column +enclosed in braces after the @code{@@multitable} command. For example: + +@example +@@multitable @{some text for column one@} @{for column two@} +@end example + +@noindent +The first column will then have the width of the typeset `some text for +column one', and the second column the width of `for column two'. + +The prototype entries need not appear in the table itself. + +Although we used simple text in this example, the prototype entries can +contain Texinfo commands; markup commands such as @code{@@code} are +particularly likely to be useful. + +@end enumerate + + +@node Multitable Rows, , Multitable Column Widths, Multi-column Tables +@subsection Multitable Rows +@cindex Multitable rows +@cindex Rows, of a multitable + +@findex item +@cindex tab +After the @code{@@multitable} command defining the column widths (see +the previous section), you begin each row in the body of a multitable +with @code{@@item}, and separate the column entries with @code{@@tab}. +Line breaks are not special within the table body, and you may break +input lines in your source file as necessary. + +Here is a complete example of a multi-column table (the text is from +@cite{The GNU Emacs Manual}, @pxref{Split Window,, Splitting Windows, +emacs, The GNU Emacs Manual}): + +@example +@@multitable @@columnfractions .15 .45 .4 +@@item Key @@tab Command @@tab Description +@@item C-x 2 +@@tab @@code@{split-window-vertically@} +@@tab Split the selected window into two windows, +with one above the other. +@@item C-x 3 +@@tab @@code@{split-window-horizontally@} +@@tab Split the selected window into two windows +positioned side by side. +@@item C-Mouse-2 +@@tab +@@tab In the mode line or scroll bar of a window, +split that window. +@@end multitable +@end example + +@noindent produces: + +@multitable @columnfractions .15 .45 .4 +@item Key @tab Command @tab Description +@item C-x 2 +@tab @code{split-window-vertically} +@tab Split the selected window into two windows, +with one above the other. +@item C-x 3 +@tab @code{split-window-horizontally} +@tab Split the selected window into two windows +positioned side by side. +@item C-Mouse-2 +@tab +@tab In the mode line or scroll bar of a window, +split that window. +@end multitable + + +@node Indices, Insertions, Lists and Tables, Top +@comment node-name, next, previous, up +@chapter Creating Indices +@cindex Indices +@cindex Creating indices + +Using Texinfo, you can generate indices without having to sort and +collate entries manually. In an index, the entries are listed in +alphabetical order, together with information on how to find the +discussion of each entry. In a printed manual, this information +consists of page numbers. In an Info file, this information is a menu +entry leading to the first node referenced.@refill + +Texinfo provides several predefined kinds of index: an index +for functions, an index for variables, an index for concepts, and so +on. You can combine indices or use them for other than their +canonical purpose. If you wish, you can define your own indices.@refill + +@menu +* Index Entries:: Choose different words for index entries. +* Predefined Indices:: Use different indices for different kinds + of entry. +* Indexing Commands:: How to make an index entry. +* Combining Indices:: How to combine indices. +* New Indices:: How to define your own indices. +@end menu + +@node Index Entries, Predefined Indices, Indices, Indices +@comment node-name, next, previous, up +@section Making Index Entries +@cindex Index entries, making +@cindex Entries, making index + +When you are making index entries, it is good practice to think of the +different ways people may look for something. Different people +@emph{do not} think of the same words when they look something up. A +helpful index will have items indexed under all the different words +that people may use. For example, one reader may think it obvious that +the two-letter names for indices should be listed under ``Indices, +two-letter names'', since the word ``Index'' is the general concept. +But another reader may remember the specific concept of two-letter +names and search for the entry listed as ``Two letter names for +indices''. A good index will have both entries and will help both +readers.@refill + +Like typesetting, the construction of an index is a highly skilled, +professional art, the subtleties of which are not appreciated until you +need to do it yourself.@refill + +@xref{Printing Indices & Menus}, for information about printing an index +at the end of a book or creating an index menu in an Info file.@refill + +@node Predefined Indices, Indexing Commands, Index Entries, Indices +@comment node-name, next, previous, up +@section Predefined Indices + +Texinfo provides six predefined indices:@refill + +@itemize @bullet +@item +A @dfn{concept index} listing concepts that are discussed.@refill + +@item +A @dfn{function index} listing functions (such as entry points of +libraries).@refill + +@item +A @dfn{variables index} listing variables (such as global variables +of libraries).@refill + +@item +A @dfn{keystroke index} listing keyboard commands.@refill + +@item +A @dfn{program index} listing names of programs.@refill + +@item +A @dfn{data type index} listing data types (such as structures defined in +header files).@refill +@end itemize + +@noindent +Not every manual needs all of these, and most manuals use two or three +of them. This manual has two indices: a +concept index and an @@-command index (that is actually the function +index but is called a command index in the chapter heading). Two or +more indices can be combined into one using the @code{@@synindex} or +@code{@@syncodeindex} commands. @xref{Combining Indices}.@refill + +@node Indexing Commands, Combining Indices, Predefined Indices, Indices +@comment node-name, next, previous, up +@section Defining the Entries of an Index +@cindex Defining indexing entries +@cindex Index entries +@cindex Entries for an index +@cindex Specifying index entries +@cindex Creating index entries + +The data to make an index come from many individual indexing commands +scattered throughout the Texinfo source file. Each command says to add +one entry to a particular index; after formatting, the index will give +the current page number or node name as the reference.@refill + +An index entry consists of an indexing command at the beginning of a +line followed, on the rest of the line, by the entry.@refill + +For example, this section begins with the following five entries for +the concept index:@refill + +@example +@@cindex Defining indexing entries +@@cindex Index entries +@@cindex Entries for an index +@@cindex Specifying index entries +@@cindex Creating index entries +@end example + +Each predefined index has its own indexing command---@code{@@cindex} +for the concept index, @code{@@findex} for the function index, and so +on.@refill + +@cindex Writing index entries +@cindex Index entry writing +Concept index entries consist of text. The best way to write an index +is to choose entries that are terse yet clear. If you can do this, +the index often looks better if the entries are not capitalized, but +written just as they would appear in the middle of a sentence. +(Capitalize proper names and acronyms that always call for upper case +letters.) This is the case convention we use in most GNU manuals' +indices. + +If you don't see how to make an entry terse yet clear, make it longer +and clear---not terse and confusing. If many of the entries are several +words long, the index may look better if you use a different convention: +to capitalize the first word of each entry. But do not capitalize a +case-sensitive name such as a C or Lisp function name or a shell +command; that would be a spelling error. + +Whichever case convention you use, please use it consistently! + +@ignore +Concept index entries consist of English text. The usual convention +is to capitalize the first word of each such index entry, unless that +word is the name of a function, variable, or other such entity that +should not be capitalized. However, if your concept index entries are +consistently short (one or two words each) it may look better for each +regular entry to start with a lower case letter, aside from proper +names and acronyms that always call for upper case letters. Whichever +convention you adapt, please be consistent! +@end ignore + +Entries in indices other than the concept index are symbol names in +programming languages, or program names; these names are usually +case-sensitive, so use upper and lower case as required for them. + +By default, entries for a concept index are printed in a small roman +font and entries for the other indices are printed in a small +@code{@@code} font. You may change the way part of an entry is +printed with the usual Texinfo commands, such as @code{@@file} for +file names and @code{@@emph} for emphasis (@pxref{Marking +Text}).@refill +@cindex Index font types + +@cindex Predefined indexing commands +@cindex Indexing commands, predefined +The six indexing commands for predefined indices are: + +@table @code +@item @@cindex @var{concept} +@findex cindex +Make an entry in the concept index for @var{concept}.@refill + +@item @@findex @var{function} +@findex findex +Make an entry in the function index for @var{function}.@refill + +@item @@vindex @var{variable} +@findex vindex +Make an entry in the variable index for @var{variable}.@refill + +@item @@kindex @var{keystroke} +@findex kindex +Make an entry in the key index for @var{keystroke}.@refill + +@item @@pindex @var{program} +@findex pindex +Make an entry in the program index for @var{program}.@refill + +@item @@tindex @var{data type} +@findex tindex +Make an entry in the data type index for @var{data type}.@refill +@end table + +@quotation +@strong{Caution:} Do not use a colon in an index entry. In Info, a +colon separates the menu entry name from the node name. An extra +colon confuses Info. +@xref{Menu Parts, , The Parts of a Menu}, +for more information about the structure of a menu entry.@refill +@end quotation + +If you write several identical index entries in different places in a +Texinfo file, the index in the printed manual will list all the pages to +which those entries refer. However, the index in the Info file will +list @strong{only} the node that references the @strong{first} of those +index entries. Therefore, it is best to write indices in which each +entry refers to only one place in the Texinfo file. Fortunately, this +constraint is a feature rather than a loss since it means that the index +will be easy to use. Otherwise, you could create an index that lists +several pages for one entry and your reader would not know to which page +to turn. If you have two identical entries for one topic, change the +topics slightly, or qualify them to indicate the difference.@refill + +You are not actually required to use the predefined indices for their +canonical purposes. For example, suppose you wish to index some C +preprocessor macros. You could put them in the function index along +with actual functions, just by writing @code{@@findex} commands for +them; then, when you print the ``Function Index'' as an unnumbered +chapter, you could give it the title `Function and Macro Index' and +all will be consistent for the reader. Or you could put the macros in +with the data types by writing @code{@@tindex} commands for them, and +give that index a suitable title so the reader will understand. +(@xref{Printing Indices & Menus}.)@refill + +@node Combining Indices, New Indices, Indexing Commands, Indices +@comment node-name, next, previous, up +@section Combining Indices +@cindex Combining indices +@cindex Indices, combining them + +Sometimes you will want to combine two disparate indices such as functions +and concepts, perhaps because you have few enough of one of them that +a separate index for them would look silly.@refill + +You could put functions into the concept index by writing +@code{@@cindex} commands for them instead of @code{@@findex} commands, +and produce a consistent manual by printing the concept index with the +title `Function and Concept Index' and not printing the `Function +Index' at all; but this is not a robust procedure. It works only if +your document is never included as part of another +document that is designed to have a separate function index; if your +document were to be included with such a document, the functions from +your document and those from the other would not end up together. +Also, to make your function names appear in the right font in the +concept index, you would need to enclose every one of them between +the braces of @code{@@code}.@refill + +@menu +* syncodeindex:: How to merge two indices, using @code{@@code} + font for the merged-from index. +* synindex:: How to merge two indices, using the + default font of the merged-to index. +@end menu + +@node syncodeindex, synindex, Combining Indices, Combining Indices +@subsection @code{@@syncodeindex} +@findex syncodeindex + +When you want to combine functions and concepts into one index, you +should index the functions with @code{@@findex} and index the concepts +with @code{@@cindex}, and use the @code{@@syncodeindex} command to +redirect the function index entries into the concept index.@refill +@findex syncodeindex + +The @code{@@syncodeindex} command takes two arguments; they are the name +of the index to redirect, and the name of the index to redirect it to. +The template looks like this:@refill + +@example +@@syncodeindex @var{from} @var{to} +@end example + +@cindex Predefined names for indices +@cindex Two letter names for indices +@cindex Indices, two letter names +@cindex Names for indices +For this purpose, the indices are given two-letter names:@refill + +@table @samp +@item cp +concept index +@item fn +function index +@item vr +variable index +@item ky +key index +@item pg +program index +@item tp +data type index +@end table + +Write an @code{@@syncodeindex} command before or shortly after the +end-of-header line at the beginning of a Texinfo file. For example, +to merge a function index with a concept index, write the +following:@refill + +@example +@@syncodeindex fn cp +@end example + +@noindent +This will cause all entries designated for the function index to merge +in with the concept index instead.@refill + +To merge both a variables index and a function index into a concept +index, write the following:@refill + +@example +@group +@@syncodeindex vr cp +@@syncodeindex fn cp +@end group +@end example + +@cindex Fonts for indices +The @code{@@syncodeindex} command puts all the entries from the `from' +index (the redirected index) into the @code{@@code} font, overriding +whatever default font is used by the index to which the entries are +now directed. This way, if you direct function names from a function +index into a concept index, all the function names are printed in the +@code{@@code} font as you would expect.@refill + +@node synindex, , syncodeindex, Combining Indices +@subsection @code{@@synindex} +@findex synindex + +The @code{@@synindex} command is nearly the same as the +@code{@@syncodeindex} command, except that it does not put the +`from' index entries into the @code{@@code} font; rather it puts +them in the roman font. Thus, you use @code{@@synindex} when you +merge a concept index into a function index.@refill + +@xref{Printing Indices & Menus}, for information about printing an index +at the end of a book or creating an index menu in an Info file.@refill + +@node New Indices, , Combining Indices, Indices +@section Defining New Indices +@cindex Defining new indices +@cindex Indices, defining new +@cindex New index defining +@findex defindex +@findex defcodeindex + +In addition to the predefined indices, you may use the +@code{@@defindex} and @code{@@defcodeindex} commands to define new +indices. These commands create new indexing @@-commands with which +you mark index entries. The @code{@@defindex }command is used like +this:@refill + +@example +@@defindex @var{name} +@end example + +The name of an index should be a two letter word, such as @samp{au}. +For example:@refill + +@example +@@defindex au +@end example + +This defines a new index, called the @samp{au} index. At the same +time, it creates a new indexing command, @code{@@auindex}, that you +can use to make index entries. Use the new indexing command just as +you would use a predefined indexing command.@refill + +For example, here is a section heading followed by a concept index +entry and two @samp{au} index entries.@refill + +@example +@@section Cognitive Semantics +@@cindex kinesthetic image schemas +@@auindex Johnson, Mark +@@auindex Lakoff, George +@end example + +@noindent +(Evidently, @samp{au} serves here as an abbreviation for ``author''.) +Texinfo constructs the new indexing command by concatenating the name +of the index with @samp{index}; thus, defining an @samp{au} index +leads to the automatic creation of an @code{@@auindex} command.@refill + +Use the @code{@@printindex} command to print the index, as you do with +the predefined indices. For example:@refill + +@example +@group +@@node Author Index, Subject Index, , Top +@@unnumbered Author Index + +@@printindex au +@end group +@end example + +The @code{@@defcodeindex} is like the @code{@@defindex} command, except +that, in the printed output, it prints entries in an @code{@@code} font +instead of a roman font. Thus, it parallels the @code{@@findex} command +rather than the @code{@@cindex} command.@refill + +You should define new indices within or right after the end-of-header +line of a Texinfo file, before any @code{@@synindex} or +@code{@@syncodeindex} commands (@pxref{Header}).@refill + +@node Insertions, Breaks, Indices, Top +@comment node-name, next, previous, up +@chapter Special Insertions +@cindex Inserting special characters and symbols +@cindex Special insertions + +Texinfo provides several commands for inserting characters that have +special meaning in Texinfo, such as braces, and for other graphic +elements that do not correspond to simple characters you can type. + +@iftex +These are: + +@itemize @bullet +@item Braces, @samp{@@} and periods. +@item Whitespace within and around a sentence. +@item Accents. +@item Dots and bullets. +@item The @TeX{} logo and the copyright symbol. +@item Mathematical expressions. +@end itemize +@end iftex + +@menu +* Braces Atsigns:: How to insert braces, @samp{@@}. +* Inserting Space:: How to insert the right amount of space + within a sentence. +* Inserting Accents:: How to insert accents and special characters. +* Dots Bullets:: How to insert dots and bullets. +* TeX and copyright:: How to insert the @TeX{} logo + and the copyright symbol. +* pounds:: How to insert the pounds currency symbol. +* minus:: How to insert a minus sign. +* math:: How to format a mathematical expression. +* Glyphs:: How to indicate results of evaluation, + expansion of macros, errors, etc. +* Images:: How to include graphics. +@end menu + + +@node Braces Atsigns, Inserting Space, Insertions, Insertions +@section Inserting @@ and Braces +@cindex Inserting @@, braces +@cindex Braces, inserting +@cindex Special characters, commands to insert +@cindex Commands to insert special characters + +@samp{@@} and curly braces are special characters in Texinfo. To insert +these characters so they appear in text, you must put an @samp{@@} in +front of these characters to prevent Texinfo from misinterpreting +them. + +Do not put braces after any of these commands; they are not +necessary. + +@menu +* Inserting An Atsign:: How to insert @samp{@@}. +* Inserting Braces:: How to insert @samp{@{} and @samp{@}}. +@end menu + +@node Inserting An Atsign, Inserting Braces, Braces Atsigns, Braces Atsigns +@subsection Inserting @samp{@@} with @@@@ +@findex @@ @r{(single @samp{@@})} + +@code{@@@@} stands for a single @samp{@@} in either printed or Info +output. + +Do not put braces after an @code{@@@@} command. + +@node Inserting Braces, , Inserting An Atsign, Braces Atsigns +@subsection Inserting @samp{@{} and @samp{@}}with @@@{ and @@@} +@findex @{ @r{(single @samp{@{})} +@findex @} @r{(single @samp{@}})} + +@code{@@@{} stands for a single @samp{@{} in either printed or Info +output. + +@code{@@@}} stands for a single @samp{@}} in either printed or Info +output. + +Do not put braces after either an @code{@@@{} or an @code{@@@}} +command. + + +@node Inserting Space, Inserting Accents, Braces Atsigns, Insertions +@section Inserting Space + +@cindex Inserting space +@cindex Spacing, inserting +@cindex Whitespace, inserting +The following sections describe commands that control spacing of various +kinds within and after sentences. + +@menu +* Not Ending a Sentence:: Sometimes a . doesn't end a sentence. +* Ending a Sentence:: Sometimes it does. +* Multiple Spaces:: Inserting multiple spaces. +* dmn:: How to format a dimension. +@end menu + +@node Not Ending a Sentence, Ending a Sentence, Inserting Space, Inserting Space +@subsection Not Ending a Sentence + +@cindex Not ending a sentence +@cindex Sentence non-ending punctuation +@cindex Periods, inserting +Depending on whether a period or exclamation point or question mark is +inside or at the end of a sentence, less or more space is inserted after +a period in a typeset manual. Since it is not always possible for +Texinfo to determine when a period ends a sentence and when it is used +in an abbreviation, special commands are needed in some circumstances. +(Usually, Texinfo can guess how to handle periods, so you do not need to +use the special commands; you just enter a period as you would if you +were using a typewriter, which means you put two spaces after the +period, question mark, or exclamation mark that ends a sentence.) + +@findex : @r{(suppress widening)} +Use the @code{@@:}@: command after a period, question mark, +exclamation mark, or colon that should not be followed by extra space. +For example, use @code{@@:}@: after periods that end abbreviations +which are not at the ends of sentences. + +@need 700 +For example, + +@example +The s.o.p.@@: has three parts @dots{} +The s.o.p. has three parts @dots{} +@end example + +@noindent +@ifinfo +produces +@end ifinfo +@iftex +produces the following. If you look carefully at this printed output, +you will see a little more whitespace after @samp{s.o.p.} in the second +line.@refill +@end iftex + +@quotation +The s.o.p.@: has three parts @dots{}@* +The s.o.p. has three parts @dots{} +@end quotation + +@noindent +(Incidentally, @samp{s.o.p.} is an abbreviation for ``Standard Operating +Procedure''.) + +@code{@@:} has no effect on the Info output. Do not put braces after +@code{@@:}. + + +@node Ending a Sentence, Multiple Spaces, Not Ending a Sentence, Inserting Space +@subsection Ending a Sentence + +@cindex Ending a Sentence +@cindex Sentence ending punctuation + +@findex . @r{(end of sentence)} +@findex ! @r{(end of sentence)} +@findex ? @r{(end of sentence)} +Use @code{@@.}@: instead of a period, @code{@@!}@: instead of an +exclamation point, and @code{@@?}@: instead of a question mark at the end +of a sentence that ends with a single capital letter. Otherwise, @TeX{} +will think the letter is an abbreviation and will not insert the correct +end-of-sentence spacing. Here is an example: + +@example +Give it to M.I.B. and to M.E.W@@. Also, give it to R.J.C@@. +Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. +@end example + +@noindent +@ifinfo +produces +@end ifinfo +@iftex +produces the following. If you look carefully at this printed output, +you will see a little more whitespace after the @samp{W} in the first +line. +@end iftex + +@quotation +Give it to M.I.B. and to M.E.W@. Also, give it to R.J.C@.@* +Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. +@end quotation + +In the Info file output, @code{@@.}@: is equivalent to a simple +@samp{.}; likewise for @code{@@!}@: and @code{@@?}@:. + +The meanings of @code{@@:} and @code{@@.}@: in Texinfo are designed to +work well with the Emacs sentence motion commands (@pxref{Sentences,,, +emacs, The GNU Emacs Manual}). This made it necessary for them to be +incompatible with some other formatting systems that use @@-commands. + +Do not put braces after any of these commands. + + +@node Multiple Spaces, dmn, Ending a Sentence, Inserting Space +@subsection Multiple Spaces + +@cindex Multiple spaces +@cindex Whitespace, inserting +@findex (space) +@findex (tab) +@findex (newline) + +Ordinarily, @TeX{} collapses multiple whitespace characters (space, tab, +and newline) into a single space. Info output, on the other hand, +preserves whitespace as you type it, except for changing a newline into +a space; this is why it is important to put two spaces at the end of +sentences in Texinfo documents. + +Occasionally, you may want to actually insert several consecutive +spaces, either for purposes of example (what your program does with +multiple spaces as input), or merely for purposes of appearance in +headings or lists. Texinfo supports three commands: +@code{@@@kbd{SPACE}}, @code{@@@kbd{TAB}}, and @code{@@@kbd{NL}}, all of +which insert a single space into the output. (Here, +@code{@@@kbd{SPACE}} represents an @samp{@@} character followed by a +space, i.e., @samp{@@ }, and @kbd{TAB} and @kbd{NL} represent the tab +character and end-of-line, i.e., when @samp{@@} is the last character on +a line.) + +For example, +@example +Spacey@@ @@ @@ @@ +example. +@end example + +@noindent produces + +@example +Spacey@ @ @ @ +example. +@end example + +Other possible uses of @code{@@@kbd{SPACE}} have been subsumed by +@code{@@multitable} (@pxref{Multi-column Tables}). + +Do not follow any of these commands with braces. + + +@node dmn, , Multiple Spaces, Inserting Space +@subsection @code{@@dmn}@{@var{dimension}@}: Format a Dimension +@cindex Thin space between number, dimension +@cindex Dimension formatting +@cindex Format a dimension +@findex dmn + +At times, you may want to write @samp{12@dmn{pt}} or +@samp{8.5@dmn{in}} with little or no space between the number and the +abbreviation for the dimension. You can use the @code{@@dmn} command +to do this. On seeing the command, @TeX{} inserts just enough space +for proper typesetting; the Info formatting commands insert no space +at all, since the Info file does not require it.@refill + +To use the @code{@@dmn} command, write the number and then follow it +immediately, with no intervening space, by @code{@@dmn}, and then by +the dimension within braces. For example, + +@example +A4 paper is 8.27@@dmn@{in@} wide. +@end example + +@noindent +produces + +@quotation +A4 paper is 8.27@dmn{in} wide. +@end quotation + +Not everyone uses this style. Some people prefer @w{@samp{8.27 in.@@:}} +or @w{@samp{8.27 inches}} to @samp{8.27@@dmn@{in@}} in the Texinfo file. +In these cases, however, the formatters may insert a line break between +the number and the dimension, so use @code{@@w} (@pxref{w}). Also, if +you write a period after an abbreviation within a sentence, you should +write @samp{@@:} after the period to prevent @TeX{} from inserting extra +whitespace, as shown here. @xref{Inserting Space}. + + +@node Inserting Accents, Dots Bullets, Inserting Space, Insertions +@section Inserting Accents + +@cindex Inserting accents +@cindex Accents, inserting +@cindex Floating accents, inserting + +Here is a table with the commands Texinfo provides for inserting +floating accents. The commands with non-alphabetic names do not take +braces around their argument (which is taken to be the next character). +(Exception: @code{@@,} @emph{does} take braces around its argument.) +This is so as to make the source as convenient to type and read as +possible, since accented characters are very common in some languages. + +@findex " +@cindex Umlaut accent +@findex ' +@cindex Acute accent +@findex = +@cindex Macron accent +@findex ^ +@cindex Circumflex accent +@findex ` +@cindex Grave accent +@findex ~ +@cindex Tilde accent +@findex , +@cindex Cedilla accent +@findex dotaccent +@cindex Dot accent +@findex H +@cindex Hungariam umlaut accent +@findex ringaccent +@cindex Ring accent +@findex tieaccent +@cindex Tie-after accent +@findex u +@cindex Breve accent +@findex ubaraccent +@cindex Underbar accent +@findex udotaccent +@cindex Underdot accent +@findex v +@cindex Check accent +@multitable {@@questiondown@{@}} {Output} {macron/overbar accent} +@item Command @tab Output @tab What +@item @t{@@"o} @tab @"o @tab umlaut accent +@item @t{@@'o} @tab @'o @tab acute accent +@item @t{@@,@{c@}} @tab @,{c} @tab cedilla accent +@item @t{@@=o} @tab @=o @tab macron/overbar accent +@item @t{@@^o} @tab @^o @tab circumflex accent +@item @t{@@`o} @tab @`o @tab grave accent +@item @t{@@~o} @tab @~o @tab tilde accent +@item @t{@@dotaccent@{o@}} @tab @dotaccent{o} @tab overdot accent +@item @t{@@H@{o@}} @tab @H{o} @tab long Hungarian umlaut +@item @t{@@ringaccent@{o@}} @tab @ringaccent{o} @tab ring accent +@item @t{@@tieaccent@{oo@}} @tab @tieaccent{oo} @tab tie-after accent +@item @t{@@u@{o@}} @tab @u{o} @tab breve accent +@item @t{@@ubaraccent@{o@}} @tab @ubaraccent{o} @tab underbar accent +@item @t{@@udotaccent@{o@}} @tab @udotaccent{o} @tab underdot accent +@item @t{@@v@{o@}} @tab @v{o} @tab hacek or check accent +@end multitable + +This table lists the Texinfo commands for inserting other characters +commonly used in languages other than English. + +@findex questiondown +@cindex @questiondown{} +@findex exclamdown +@cindex @exclamdown{} +@findex aa +@cindex @aa{} +@findex AA +@cindex @AA{} +@findex ae +@cindex @ae{} +@findex AE +@cindex @AE{} +@findex dotless +@cindex @dotless{i} +@cindex @dotless{j} +@cindex Dotless i, j +@findex l +@cindex @l{} +@findex L +@cindex @L{} +@findex o +@cindex @o{} +@findex O +@cindex @O{} +@findex oe +@cindex @oe{} +@findex OE +@cindex @OE{} +@findex ss +@cindex @ss{} +@cindex Es-zet +@cindex Sharp S +@cindex German S +@multitable {@@questiondown@{@}} {oe,OE} {es-zet or sharp S} +@item @t{@@exclamdown@{@}} @tab @exclamdown{} @tab upside-down ! +@item @t{@@questiondown@{@}} @tab @questiondown{} @tab upside-down ? +@item @t{@@aa@{@},@@AA@{@}} @tab @aa{},@AA{} @tab A,a with circle +@item @t{@@ae@{@},@@AE@{@}} @tab @ae{},@AE{} @tab ae,AE ligatures +@item @t{@@dotless@{i@}} @tab @dotless{i} @tab dotless i +@item @t{@@dotless@{j@}} @tab @dotless{j} @tab dotless j +@item @t{@@l@{@},@@L@{@}} @tab @l{},@L{} @tab suppressed-L,l +@item @t{@@o@{@},@@O@{@}} @tab @o{},@O{} @tab O,o with slash +@item @t{@@oe@{@},@@OE@{@}} @tab @oe{},@OE{} @tab OE,oe ligatures +@item @t{@@ss@{@}} @tab @ss{} @tab es-zet or sharp S +@end multitable + + +@node Dots Bullets, TeX and copyright, Inserting Accents, Insertions +@section Inserting Ellipsis, Dots, and Bullets +@cindex Dots, inserting +@cindex Bullets, inserting +@cindex Ellipsis, inserting +@cindex Inserting ellipsis +@cindex Inserting dots +@cindex Special typesetting commands +@cindex Typesetting commands for dots, etc. + +An @dfn{ellipsis} (a line of dots) is not typeset as a string of +periods, so a special command is used for ellipsis in Texinfo. The +@code{@@bullet} command is special, too. Each of these commands is +followed by a pair of braces, @samp{@{@}}, without any whitespace +between the name of the command and the braces. (You need to use braces +with these commands because you can use them next to other text; without +the braces, the formatters would be confused. @xref{Command Syntax, , +@@-Command Syntax}, for further information.)@refill + +@menu +* dots:: How to insert dots @dots{} +* bullet:: How to insert a bullet. +@end menu + + +@node dots, bullet, Dots Bullets, Dots Bullets +@subsection @code{@@dots}@{@} (@dots{}) +@findex dots +@cindex Inserting dots +@cindex Dots, inserting + +Use the @code{@@dots@{@}} command to generate an ellipsis, which is +three dots in a row, appropriately spaced, like this: `@dots{}'. Do +not simply write three periods in the input file; that would work for +the Info file output, but would produce the wrong amount of space +between the periods in the printed manual. + +Similarly, the @code{@@enddots@{@}} command generates an +end-of-sentence ellipsis (four dots) @enddots{} + +@iftex +Here is an ellipsis: @dots{} +Here are three periods in a row: ... + +In printed output, the three periods in a row are closer together than +the dots in the ellipsis. +@end iftex + + +@node bullet, , dots, Dots Bullets +@subsection @code{@@bullet}@{@} (@bullet{}) +@findex bullet + +Use the @code{@@bullet@{@}} command to generate a large round dot, or +the closest possible thing to one. In Info, an asterisk is used.@refill + +Here is a bullet: @bullet{} + +When you use @code{@@bullet} in @code{@@itemize}, you do not need to +type the braces, because @code{@@itemize} supplies them. +(@xref{itemize, , @code{@@itemize}}.)@refill + + +@node TeX and copyright, pounds, Dots Bullets, Insertions +@section Inserting @TeX{} and the Copyright Symbol + +The logo `@TeX{}' is typeset in a special fashion and it needs an +@@-command. The copyright symbol, `@copyright{}', is also special. +Each of these commands is followed by a pair of braces, @samp{@{@}}, +without any whitespace between the name of the command and the +braces.@refill + +@menu +* tex:: How to insert the @TeX{} logo. +* copyright symbol:: How to use @code{@@copyright}@{@}. +@end menu + + +@node tex, copyright symbol, TeX and copyright, TeX and copyright +@subsection @code{@@TeX}@{@} (@TeX{}) +@findex tex (command) + +Use the @code{@@TeX@{@}} command to generate `@TeX{}'. In a printed +manual, this is a special logo that is different from three ordinary +letters. In Info, it just looks like @samp{TeX}. The +@code{@@TeX@{@}} command is unique among Texinfo commands in that the +@kbd{T} and the @kbd{X} are in upper case.@refill + + +@node copyright symbol, , tex, TeX and copyright +@subsection @code{@@copyright}@{@} (@copyright{}) +@findex copyright + +Use the @code{@@copyright@{@}} command to generate `@copyright{}'. In +a printed manual, this is a @samp{c} inside a circle, and in Info, +this is @samp{(C)}.@refill + + +@node pounds, minus, TeX and copyright, Insertions +@section @code{@@pounds}@{@} (@pounds{}): Pounds Sterling +@findex pounds + +Use the @code{@@pounds@{@}} command to generate `@pounds{}'. In a +printed manual, this is the symbol for the currency pounds sterling. +In Info, it is a @samp{#}. Other currency symbols are unfortunately not +available. + + +@node minus, math, pounds, Insertions +@section @code{@@minus}@{@} (@minus{}): Inserting a Minus Sign +@findex minus + +Use the @code{@@minus@{@}} command to generate a minus sign. In a +fixed-width font, this is a single hyphen, but in a proportional font, +the symbol is the customary length for a minus sign---a little longer +than a hyphen, shorter than an em-dash: + +@display +@samp{@minus{}} is a minus sign generated with @samp{@@minus@{@}}, + +`-' is a hyphen generated with the character @samp{-}, + +`---' is an em-dash for text. +@end display + +@noindent +In the fixed-width font used by Info, @code{@@minus@{@}} is the same +as a hyphen. + +You should not use @code{@@minus@{@}} inside @code{@@code} or +@code{@@example} because the width distinction is not made in the +fixed-width font they use. + +When you use @code{@@minus} to specify the mark beginning each entry in +an itemized list, you do not need to type the braces +(@pxref{itemize, , @code{@@itemize}}.) + + +@node math, Glyphs, minus, Insertions +@section @code{@@math}: Inserting Mathematical Expressions +@findex math +@cindex Mathematical expressions + +You can write a short mathematical expression with the @code{@@math} +command. Write the mathematical expression between braces, like this: + +@example +@@math@{(a + b)(a + b) = a^2 + 2ab + b^2@} +@end example + +@iftex +@need 1000 +@noindent +This produces the following in @TeX{}: + +@display +@math{(a + b)(a + b) = a^2 + 2ab + b^2} +@end display + +@noindent +and the following in Info: +@end iftex +@ifinfo +@noindent +This produces the following in Info: +@end ifinfo + +@example +(a + b)(a + b) = a^2 + 2ab + b^2 +@end example + +Thus, the @code{@@math} command has no effect on the Info output. + +For complex mathematical expressions, you can also use @TeX{} directly +(@pxref{Raw Formatter Commands}). When you use @TeX{} directly, +remember to write the mathematical expression between one or two +@samp{$} (dollar-signs) as appropriate. + + +@node Glyphs, Images, math, Insertions +@section Glyphs for Examples +@cindex Glyphs + +In Texinfo, code is often illustrated in examples that are delimited +by @code{@@example} and @code{@@end example}, or by @code{@@lisp} and +@code{@@end lisp}. In such examples, you can indicate the results of +evaluation or an expansion using @samp{@result{}} or +@samp{@expansion{}}. Likewise, there are commands to insert glyphs +to indicate +printed output, error messages, equivalence of expressions, and the +location of point.@refill + +The glyph-insertion commands do not need to be used within an example, but +most often they are. Every glyph-insertion command is followed by a pair of +left- and right-hand braces.@refill + +@menu +* Glyphs Summary:: +* result:: How to show the result of expression. +* expansion:: How to indicate an expansion. +* Print Glyph:: How to indicate printed output. +* Error Glyph:: How to indicate an error message. +* Equivalence:: How to indicate equivalence. +* Point Glyph:: How to indicate the location of point. +@end menu + +@node Glyphs Summary, result, Glyphs, Glyphs +@ifinfo +@subheading Glyphs Summary + +Here are the different glyph commands:@refill +@end ifinfo + +@table @asis +@item @result{} +@code{@@result@{@}} points to the result of an expression.@refill + +@item @expansion{} +@code{@@expansion@{@}} shows the results of a macro expansion.@refill + +@item @print{} +@code{@@print@{@}} indicates printed output.@refill + +@item @error{} +@code{@@error@{@}} indicates that the following text is an error +message.@refill + +@item @equiv{} +@code{@@equiv@{@}} indicates the exact equivalence of two forms.@refill + +@item @point{} +@code{@@point@{@}} shows the location of point.@refill +@end table + + +@menu +* result:: +* expansion:: +* Print Glyph:: +* Error Glyph:: +* Equivalence:: +* Point Glyph:: +@end menu + +@node result, expansion, Glyphs Summary, Glyphs +@subsection @code{@@result@{@}} (@result{}): Indicating Evaluation +@cindex Result of an expression +@cindex Indicating evaluation +@cindex Evaluation glyph +@cindex Value of an expression, indicating + +Use the @code{@@result@{@}} command to indicate the result of +evaluating an expression.@refill + +@iftex +The @code{@@result@{@}} command is displayed as @samp{=>} in Info and +as @samp{@result{}} in the printed output. +@end iftex +@ifinfo +The @code{@@result@{@}} command is displayed as @samp{@result{}} in Info +and as a double stemmed arrow in the printed output.@refill +@end ifinfo + +Thus, the following, + +@lisp +(cdr '(1 2 3)) + @result{} (2 3) +@end lisp + +@noindent +may be read as ``@code{(cdr '(1 2 3))} evaluates to @code{(2 3)}''. + + +@node expansion, Print Glyph, result, Glyphs +@subsection @code{@@expansion@{@}} (@expansion{}): Indicating an Expansion +@cindex Expansion, indicating it + +When an expression is a macro call, it expands into a new expression. +You can indicate the result of the expansion with the +@code{@@expansion@{@}} command.@refill + +@iftex +The @code{@@expansion@{@}} command is displayed as @samp{==>} in Info and +as @samp{@expansion{}} in the printed output. +@end iftex +@ifinfo +The @code{@@expansion@{@}} command is displayed as @samp{@expansion{}} +in Info and as a long arrow with a flat base in the printed output.@refill +@end ifinfo + +@need 700 +For example, the following + +@example +@group +@@lisp +(third '(a b c)) + @@expansion@{@} (car (cdr (cdr '(a b c)))) + @@result@{@} c +@@end lisp +@end group +@end example + +@noindent +produces + +@lisp +@group +(third '(a b c)) + @expansion{} (car (cdr (cdr '(a b c)))) + @result{} c +@end group +@end lisp + +@noindent +which may be read as: + +@quotation +@code{(third '(a b c))} expands to @code{(car (cdr (cdr '(a b c))))}; +the result of evaluating the expression is @code{c}. +@end quotation + +@noindent +Often, as in this case, an example looks better if the +@code{@@expansion@{@}} and @code{@@result@{@}} commands are indented +five spaces.@refill + + +@node Print Glyph, Error Glyph, expansion, Glyphs +@subsection @code{@@print@{@}} (@print{}): Indicating Printed Output +@cindex Printed output, indicating it + +Sometimes an expression will print output during its execution. You +can indicate the printed output with the @code{@@print@{@}} command.@refill + +@iftex +The @code{@@print@{@}} command is displayed as @samp{-|} in Info and +as @samp{@print{}} in the printed output. +@end iftex +@ifinfo +The @code{@@print@{@}} command is displayed as @samp{@print{}} in Info +and similarly, as a horizontal dash butting against a vertical bar, in +the printed output.@refill +@end ifinfo + +In the following example, the printed text is indicated with +@samp{@print{}}, and the value of the expression follows on the +last line.@refill + +@lisp +@group +(progn (print 'foo) (print 'bar)) + @print{} foo + @print{} bar + @result{} bar +@end group +@end lisp + +@noindent +In a Texinfo source file, this example is written as follows: + +@lisp +@group +@@lisp +(progn (print 'foo) (print 'bar)) + @@print@{@} foo + @@print@{@} bar + @@result@{@} bar +@@end lisp +@end group +@end lisp + + +@node Error Glyph, Equivalence, Print Glyph, Glyphs +@subsection @code{@@error@{@}} (@error{}): Indicating an Error Message +@cindex Error message, indicating it + +A piece of code may cause an error when you evaluate it. You can +designate the error message with the @code{@@error@{@}} command.@refill + +@iftex +The @code{@@error@{@}} command is displayed as @samp{error-->} in Info +and as @samp{@error{}} in the printed output. +@end iftex +@ifinfo +The @code{@@error@{@}} command is displayed as @samp{@error{}} in Info +and as the word `error' in a box in the printed output.@refill +@end ifinfo + +@need 700 +Thus, + +@example +@@lisp +(+ 23 'x) +@@error@{@} Wrong type argument: integer-or-marker-p, x +@@end lisp +@end example + +@noindent +produces + +@lisp +(+ 23 'x) +@error{} Wrong type argument: integer-or-marker-p, x +@end lisp + +@noindent +This indicates that the following error message is printed +when you evaluate the expression: + +@lisp +Wrong type argument: integer-or-marker-p, x +@end lisp + +@samp{@error{}} itself is not part of the error message. + + +@node Equivalence, Point Glyph, Error Glyph, Glyphs +@subsection @code{@@equiv@{@}} (@equiv{}): Indicating Equivalence +@cindex Equivalence, indicating it + +Sometimes two expressions produce identical results. You can indicate the +exact equivalence of two forms with the @code{@@equiv@{@}} command.@refill + +@iftex +The @code{@@equiv@{@}} command is displayed as @samp{==} in Info and +as @samp{@equiv{}} in the printed output. +@end iftex +@ifinfo +The @code{@@equiv@{@}} command is displayed as @samp{@equiv{}} in Info +and as a three parallel horizontal lines in the printed output.@refill +@end ifinfo + +Thus, + +@example +@@lisp +(make-sparse-keymap) @@equiv@{@} (list 'keymap) +@@end lisp +@end example + +@noindent +produces + +@lisp +(make-sparse-keymap) @equiv{} (list 'keymap) +@end lisp + +@noindent +This indicates that evaluating @code{(make-sparse-keymap)} produces +identical results to evaluating @code{(list 'keymap)}. + + +@node Point Glyph, , Equivalence, Glyphs +@subsection @code{@@point@{@}} (@point{}): Indicating Point in a Buffer +@cindex Point, indicating it in a buffer + +Sometimes you need to show an example of text in an Emacs buffer. In +such examples, the convention is to include the entire contents of the +buffer in question between two lines of dashes containing the buffer +name.@refill + +You can use the @samp{@@point@{@}} command to show the location of point +in the text in the buffer. (The symbol for point, of course, is not +part of the text in the buffer; it indicates the place @emph{between} +two characters where point is located.)@refill + +@iftex +The @code{@@point@{@}} command is displayed as @samp{-!-} in Info and +as @samp{@point{}} in the printed output. +@end iftex +@ifinfo +The @code{@@point@{@}} command is displayed as @samp{@point{}} in Info +and as a small five pointed star in the printed output.@refill +@end ifinfo + +The following example shows the contents of buffer @file{foo} before +and after evaluating a Lisp command to insert the word @code{changed}.@refill + +@example +@group +---------- Buffer: foo ---------- +This is the @point{}contents of foo. +---------- Buffer: foo ---------- + +@end group +@end example + +@example +@group +(insert "changed ") + @result{} nil +---------- Buffer: foo ---------- +This is the changed @point{}contents of foo. +---------- Buffer: foo ---------- + +@end group +@end example + +In a Texinfo source file, the example is written like this:@refill + +@example +@@example +---------- Buffer: foo ---------- +This is the @@point@{@}contents of foo. +---------- Buffer: foo ---------- + +(insert "changed ") + @@result@{@} nil +---------- Buffer: foo ---------- +This is the changed @@point@{@}contents of foo. +---------- Buffer: foo ---------- +@@end example +@end example + + +@c this should be described with figures when we have them +@c perhaps in the quotation/example chapter. +@node Images, , Glyphs, Insertions +@section Inserting Images + +@cindex Images, inserting +@cindex Pictures, inserting +@findex image + +You can insert an image in an external file with the @code{@@image} +command: + +@example +@@image@{@var{filename}, @r{[}@var{width}@r{]}, @r{[}@var{height}@r{]}@} +@end example + +@cindex Formats for images +@cindex Image formats +The @var{filename} argument is mandatory, and must not have an +extension, because the different processors support different formats: +@TeX{} reads the file @file{@var{filename}.eps} (Encapsulated PostScript +format); @code{makeinfo} uses @file{@var{filename}.txt} verbatim for +Info output (more or less as if it was an @code{@@example}). HTML +output requires @file{@var{filename}.jpg}. + +@cindex Width of images +@cindex Height of images +@cindex Aspect ratio of images +@cindex Distorting images +The optional @var{width} and @var{height} arguments specify the size to +scale the image to (they are ignored for Info output). If they are both +specified, the image is presented in its natural size (given in the +file); if only one is specified, the other is scaled proportionately; +and if both are specified, both are respected, thus possibly distorting +the original image by changing its aspect ratio. + +@cindex Dimensions and image sizes +The @var{width} and @var{height} may be specified using any valid @TeX{} +dimension, namely: + +@table @asis +@item pt +@cindex Points (dimension) +point (72.27pt = 1in) +@item pc +@cindex Picas +pica (1pc = 12pt) +@item bp +@cindex Big points +big point (72bp = 1in) +@item in +@cindex Inches +inch +@item cm +@cindex Centimeters +centimeter (2.54cm = 1in) +@item mm +@cindex Millimeters +millimeter (10mm = 1cm) +@item dd +@cindex Did@^ot points +did@^ot point (1157dd = 1238pt) +@item cc +@cindex Ciceros +cicero (1cc = 12dd) +@item sp +@cindex Scaled points +scaled point (65536sp = 1pt) +@end table + +@pindex ridt.eps +For example, the following will scale a file @file{ridt.eps} to one +inch vertically, with the width scaled proportionately: + +@example +@@image@{ridt,,1in@} +@end example + +@pindex epsf.tex +For @code{@@image} to work with @TeX{}, the file @file{epsf.tex} must be +installed somewhere that @TeX{} can find it. This file is included in +the Texinfo distribution and is available from +@uref{ftp://ftp.tug.org/tex/epsf.tex}. + + +@node Breaks, Definition Commands, Insertions, Top +@chapter Making and Preventing Breaks +@cindex Making line and page breaks +@cindex Preventing line and page breaks + +Usually, a Texinfo file is processed both by @TeX{} and by one of the +Info formatting commands. Line, paragraph, or page breaks sometimes +occur in the `wrong' place in one or other form of output. You must +ensure that text looks right both in the printed manual and in the +Info file.@refill + +For example, in a printed manual, page breaks may occur awkwardly in +the middle of an example; to prevent this, you can hold text together +using a grouping command that keeps the text from being split across +two pages. Conversely, you may want to force a page break where none +would occur normally. Fortunately, problems like these do not often +arise. When they do, use the break, break prevention, or pagination +commands.@refill + +@menu +* Break Commands:: Cause and prevent splits. +* Line Breaks:: How to force a single line to use two lines. +* - and hyphenation:: How to tell TeX about hyphenation points. +* w:: How to prevent unwanted line breaks. +* sp:: How to insert blank lines. +* page:: How to force the start of a new page. +* group:: How to prevent unwanted page breaks. +* need:: Another way to prevent unwanted page breaks. +@end menu + +@ifinfo +@node Break Commands, Line Breaks, Breaks, Breaks +@heading The Break Commands +@end ifinfo +@iftex +@sp 1 +@end iftex + +The break commands create or allow line and paragraph breaks:@refill + +@table @code +@item @@* +Force a line break. + +@item @@sp @var{n} +Skip @var{n} blank lines.@refill + +@item @@- +Insert a discretionary hyphen. + +@item @@hyphenation@{@var{hy-phen-a-ted words}@} +Define hyphen points in @var{hy-phen-a-ted words}. +@end table + +The line-break-prevention command holds text together all on one +line:@refill + +@table @code +@item @@w@{@var{text}@} +Prevent @var{text} from being split and hyphenated across two lines.@refill +@end table +@iftex +@sp 1 +@end iftex + +The pagination commands apply only to printed output, since Info +files do not have pages.@refill + +@table @code +@item @@page +Start a new page in the printed manual.@refill + +@item @@group +Hold text together that must appear on one printed page.@refill + +@item @@need @var{mils} +Start a new printed page if not enough space on this one.@refill +@end table + +@node Line Breaks, - and hyphenation, Break Commands, Breaks +@comment node-name, next, previous, up +@section @code{@@*}: Generate Line Breaks +@findex * @r{(force line break)} +@cindex Line breaks +@cindex Breaks in a line + +The @code{@@*} command forces a line break in both the printed manual and +in Info.@refill + +@need 700 +For example, + +@example +This line @@* is broken @@*in two places. +@end example + +@noindent +produces + +@example +@group +This line + is broken +in two places. +@end group +@end example + +@noindent +(Note that the space after the first @code{@@*} command is faithfully +carried down to the next line.)@refill + +@need 800 +The @code{@@*} command is often used in a file's copyright page:@refill + +@example +@group +This is edition 2.0 of the Texinfo documentation,@@* +and is for @dots{} +@end group +@end example + +@noindent +In this case, the @code{@@*} command keeps @TeX{} from stretching the +line across the whole page in an ugly manner.@refill + +@quotation +@strong{Please note:} Do not write braces after an @code{@@*} command; +they are not needed.@refill + +Do not write an @code{@@refill} command at the end of a paragraph +containing an @code{@@*} command; it will cause the paragraph to be +refilled after the line break occurs, negating the effect of the line +break.@refill +@end quotation + +@node - and hyphenation, w, Line Breaks, Breaks +@section @code{@@-} and @code{@@hyphenation}: Helping @TeX{} hyphenate + +@findex - +@findex hyphenation +@cindex Hyphenation, helping @TeX{} do +@cindex Fine-tuning, and hyphenation + +Although @TeX{}'s hyphenation algorithm is generally pretty good, it +does miss useful hyphenation points from time to time. (Or, far more +rarely, insert an incorrect hyphenation.) So, for documents with an +unusual vocabulary or when fine-tuning for a printed edition, you may +wish to help @TeX{} out. Texinfo supports two commands for this: + +@table @code +@item @@- +Insert a discretionary hyphen, i.e., a place where @TeX{} can (but does +not have to) hyphenate. This is especially useful when you notice +an overfull hbox is due to @TeX{} missing a hyphenation (@pxref{Overfull +hboxes}). @TeX{} will not insert any hyphenation points in a word +containing @code{@@-}. + +@item @@hyphenation@{@var{hy-phen-a-ted words}@} +Tell @TeX{} how to hyphenate @var{hy-phen-a-ted words}. As shown, you +put a @samp{-} at each hyphenation point. For example: +@example +@@hyphenation@{man-u-script man-u-scripts@} +@end example +@noindent @TeX{} only uses the specified hyphenation points when the +words match exactly, so give all necessary variants. +@end table + +Info output is not hyphenated, so these commands have no effect there. + +@node w, sp, - and hyphenation, Breaks +@comment node-name, next, previous, up +@section @code{@@w}@{@var{text}@}: Prevent Line Breaks +@findex w @r{(prevent line break)} +@cindex Line breaks, preventing +@cindex Hyphenation, preventing + +@code{@@w@{@var{text}@}} outputs @var{text} and prohibits line breaks +within @var{text}.@refill + +You can use the @code{@@w} command to prevent @TeX{} from automatically +hyphenating a long name or phrase that happens to fall near the end of a +line.@refill + +@example +You can copy GNU software from @@w@{@@samp@{ftp.gnu.ai.mit.edu@}@}. +@end example + +@noindent +produces + +@quotation +You can copy GNU software from @w{@samp{ftp.gnu.ai.mit.edu}}. +@end quotation + +@quotation +@strong{Caution:} Do not write an @code{@@refill} command at the end +of a paragraph containing an @code{@@w} command; it will cause the +paragraph to be refilled and may thereby negate the effect of the +@code{@@w} command.@refill +@end quotation + +@node sp, page, w, Breaks +@comment node-name, next, previous, up +@section @code{@@sp} @var{n}: Insert Blank Lines +@findex sp @r{(line spacing)} +@cindex Spaces (blank lines) +@cindex Blank lines +@cindex Line spacing + +A line beginning with and containing only @code{@@sp @var{n}} +generates @var{n} blank lines of space in both the printed manual and +the Info file. @code{@@sp} also forces a paragraph break. For +example,@refill + +@example +@@sp 2 +@end example + +@noindent +generates two blank lines. + +The @code{@@sp} command is most often used in the title page.@refill + +@ignore +@c node br, page, sp, Breaks +@comment node-name, next, previous, up +@c section @code{@@br}: Generate Paragraph Breaks +@findex br @r{(paragraph breaks)} +@cindex Paragraph breaks +@cindex Breaks in a paragraph + +The @code{@@br} command forces a paragraph break. It inserts a blank +line. You can use the command within or at the end of a line. If +used within a line, the @code{@@br@{@}} command must be followed by +left and right braces (as shown here) to mark the end of the +command.@refill + +@need 700 +For example, + +@example +@group +This line @@br@{@}contains and is ended by paragraph breaks@@br +and is followed by another line. +@end group +@end example + +@noindent +produces + +@example +@group +This line + +contains and is ended by paragraph breaks + +and is followed by another line. +@end group +@end example + +The @code{@@br} command is seldom used. +@end ignore + +@node page, group, sp, Breaks +@comment node-name, next, previous, up +@section @code{@@page}: Start a New Page +@cindex Page breaks +@findex page + +A line containing only @code{@@page} starts a new page in a printed +manual. The command has no effect on Info files since they are not +paginated. An @code{@@page} command is often used in the @code{@@titlepage} +section of a Texinfo file to start the copyright page.@refill + +@node group, need, page, Breaks +@comment node-name, next, previous, up +@section @code{@@group}: Prevent Page Breaks +@cindex Group (hold text together vertically) +@cindex Holding text together vertically +@cindex Vertically holding text together +@findex group + +The @code{@@group} command (on a line by itself) is used inside an +@code{@@example} or similar construct to begin an unsplittable vertical +group, which will appear entirely on one page in the printed output. +The group is terminated by a line containing only @code{@@end group}. +These two lines produce no output of their own, and in the Info file +output they have no effect at all.@refill + +@c Once said that these environments +@c turn off vertical spacing between ``paragraphs''. +@c Also, quotation used to work, but doesn't in texinfo-2.72 +Although @code{@@group} would make sense conceptually in a wide +variety of contexts, its current implementation works reliably only +within @code{@@example} and variants, and within @code{@@display}, +@code{@@format}, @code{@@flushleft} and @code{@@flushright}. +@xref{Quotations and Examples}. (What all these commands have in +common is that each line of input produces a line of output.) In +other contexts, @code{@@group} can cause anomalous vertical +spacing.@refill + +@need 750 +This formatting requirement means that you should write: + +@example +@group +@@example +@@group +@dots{} +@@end group +@@end example +@end group +@end example + +@noindent +with the @code{@@group} and @code{@@end group} commands inside the +@code{@@example} and @code{@@end example} commands. + +The @code{@@group} command is most often used to hold an example +together on one page. In this Texinfo manual, more than 100 examples +contain text that is enclosed between @code{@@group} and @code{@@end +group}. + +If you forget to end a group, you may get strange and unfathomable +error messages when you run @TeX{}. This is because @TeX{} keeps +trying to put the rest of the Texinfo file onto the one page and does +not start to generate error messages until it has processed +considerable text. It is a good rule of thumb to look for a missing +@code{@@end group} if you get incomprehensible error messages in +@TeX{}.@refill + +@node need, , group, Breaks +@comment node-name, next, previous, up +@section @code{@@need @var{mils}}: Prevent Page Breaks +@cindex Need space at page bottom +@findex need + +A line containing only @code{@@need @var{n}} starts +a new page in a printed manual if fewer than @var{n} mils (thousandths +of an inch) remain on the current page. Do not use +braces around the argument @var{n}. The @code{@@need} command has no +effect on Info files since they are not paginated.@refill + +@need 800 +This paragraph is preceded by an @code{@@need} command that tells +@TeX{} to start a new page if fewer than 800 mils (eight-tenths +inch) remain on the page. It looks like this:@refill + +@example +@group +@@need 800 +This paragraph is preceded by @dots{} +@end group +@end example + +The @code{@@need} command is useful for preventing orphans (single +lines at the bottoms of printed pages).@refill + +@node Definition Commands, Footnotes, Breaks, Top +@chapter Definition Commands +@cindex Definition commands + +The @code{@@deffn} command and the other @dfn{definition commands} +enable you to describe functions, variables, macros, commands, user +options, special forms and other such artifacts in a uniform +format.@refill + +In the Info file, a definition causes the entity +category---`Function', `Variable', or whatever---to appear at the +beginning of the first line of the definition, followed by the +entity's name and arguments. In the printed manual, the command +causes @TeX{} to print the entity's name and its arguments on the left +margin and print the category next to the right margin. In both +output formats, the body of the definition is indented. Also, the +name of the entity is entered into the appropriate index: +@code{@@deffn} enters the name into the index of functions, +@code{@@defvr} enters it into the index of variables, and so +on.@refill + +A manual need not and should not contain more than one definition for +a given name. An appendix containing a summary should use +@code{@@table} rather than the definition commands.@refill + +@menu +* Def Cmd Template:: How to structure a description using a + definition command. +* Optional Arguments:: How to handle optional and repeated arguments. +* deffnx:: How to group two or more `first' lines. +* Def Cmds in Detail:: All the definition commands. +* Def Cmd Conventions:: Conventions for writing definitions. +* Sample Function Definition:: +@end menu + +@node Def Cmd Template, Optional Arguments, Definition Commands, Definition Commands +@section The Template for a Definition +@cindex Definition template +@cindex Template for a definition + +The @code{@@deffn} command is used for definitions of entities that +resemble functions. To write a definition using the @code{@@deffn} +command, write the @code{@@deffn} command at the beginning of a line +and follow it on the same line by the category of the entity, the name +of the entity itself, and its arguments (if any). Then write the body +of the definition on succeeding lines. (You may embed examples in the +body.) Finally, end the definition with an @code{@@end deffn} command +written on a line of its own. (The other definition commands follow +the same format.)@refill + +The template for a definition looks like this: + +@example +@group +@@deffn @var{category} @var{name} @var{arguments}@dots{} +@var{body-of-definition} +@@end deffn +@end group +@end example + +@need 700 +@noindent +For example, + +@example +@group +@@deffn Command forward-word count +This command moves point forward @@var@{count@} words +(or backward if @@var@{count@} is negative). @dots{} +@@end deffn +@end group +@end example + +@noindent +produces + +@quotation +@deffn Command forward-word count +This function moves point forward @var{count} words +(or backward if @var{count} is negative). @dots{} +@end deffn +@end quotation + +Capitalize the category name like a title. If the name of the +category contains spaces, as in the phrase `Interactive Command', +write braces around it. For example:@refill + +@example +@group +@@deffn @{Interactive Command@} isearch-forward +@dots{} +@@end deffn +@end group +@end example + +@noindent +Otherwise, the second word will be mistaken for the name of the +entity.@refill + +Some of the definition commands are more general than others. The +@code{@@deffn} command, for example, is the general definition command +for functions and the like---for entities that may take arguments. When +you use this command, you specify the category to which the entity +belongs. The @code{@@deffn} command possesses three predefined, +specialized variations, @code{@@defun}, @code{@@defmac}, and +@code{@@defspec}, that specify the category for you: ``Function'', +``Macro'', and ``Special Form'' respectively. (In Lisp, a special form +is an entity much like a function.) The @code{@@defvr} command also is +accompanied by several predefined, specialized variations for describing +particular kinds of variables.@refill + +The template for a specialized definition, such as @code{@@defun}, is +similar to the template for a generalized definition, except that you +do not need to specify the category:@refill + +@example +@group +@@defun @var{name} @var{arguments}@dots{} +@var{body-of-definition} +@@end defun +@end group +@end example + +@noindent +Thus, + +@example +@group +@@defun buffer-end flag +This function returns @@code@{(point-min)@} if @@var@{flag@} +is less than 1, @@code@{(point-max)@} otherwise. +@dots{} +@@end defun +@end group +@end example + +@noindent +produces + +@quotation +@defun buffer-end flag +This function returns @code{(point-min)} if @var{flag} is less than 1, +@code{(point-max)} otherwise. @dots{} +@end defun +@end quotation + +@noindent +@xref{Sample Function Definition, Sample Function Definition, A Sample +Function Definition}, for a more detailed example of a function +definition, including the use of @code{@@example} inside the +definition.@refill + +The other specialized commands work like @code{@@defun}.@refill + +@node Optional Arguments, deffnx, Def Cmd Template, Definition Commands +@section Optional and Repeated Arguments +@cindex Optional and repeated arguments +@cindex Repeated and optional arguments +@cindex Arguments, repeated and optional +@cindex Syntax, optional & repeated arguments +@cindex Meta-syntactic chars for arguments + +Some entities take optional or repeated arguments, which may be +specified by a distinctive glyph that uses square brackets and +ellipses. For @w{example}, a special form often breaks its argument list +into separate arguments in more complicated ways than a +straightforward function.@refill + +@iftex +An argument enclosed within square brackets is optional. +Thus, the phrase +@samp{@code{@r{[}@var{optional-arg}@r{]}}} means that +@var{optional-arg} is optional. +An argument followed by an ellipsis is optional +and may be repeated more than once. +@c This is consistent with Emacs Lisp Reference manual +Thus, @samp{@var{repeated-args}@dots{}} stands for zero or more arguments. +Parentheses are used when several arguments are grouped +into additional levels of list structure in Lisp. +@end iftex +@c The following looks better in Info (no `r', `samp' and `code'): +@ifinfo +An argument enclosed within square brackets is optional. +Thus, [@var{optional-arg}] means that @var{optional-arg} is optional. +An argument followed by an ellipsis is optional +and may be repeated more than once. +@c This is consistent with Emacs Lisp Reference manual +Thus, @var{repeated-args}@dots{} stands for zero or more arguments. +Parentheses are used when several arguments are grouped +into additional levels of list structure in Lisp. +@end ifinfo + +Here is the @code{@@defspec} line of an example of an imaginary +special form:@refill + +@quotation +@defspec foobar (@var{var} [@var{from} @var{to} [@var{inc}]]) @var{body}@dots{} +@end defspec +@tex +\vskip \parskip +@end tex +@end quotation + +@noindent +In this example, the arguments @var{from} and @var{to} are optional, +but must both be present or both absent. If they are present, +@var{inc} may optionally be specified as well. These arguments are +grouped with the argument @var{var} into a list, to distinguish them +from @var{body}, which includes all remaining elements of the +form.@refill + +In a Texinfo source file, this @code{@@defspec} line is written like +this (except it would not be split over two lines, as it is in this +example).@refill + +@example +@group +@@defspec foobar (@@var@{var@} [@@var@{from@} @@var@{to@} + [@@var@{inc@}]]) @@var@{body@}@@dots@{@} +@end group +@end example + +@noindent +The function is listed in the Command and Variable Index under +@samp{foobar}.@refill + +@node deffnx, Def Cmds in Detail, Optional Arguments, Definition Commands +@section Two or More `First' Lines +@cindex Two `First' Lines for @code{@@deffn} +@cindex Grouping two definitions together +@cindex Definitions grouped together +@findex deffnx + +To create two or more `first' or header lines for a definition, follow +the first @code{@@deffn} line by a line beginning with @code{@@deffnx}. +The @code{@@deffnx} command works exactly like @code{@@deffn} +except that it does not generate extra vertical white space between it +and the preceding line.@refill + +@need 1000 +For example, + +@example +@group +@@deffn @{Interactive Command@} isearch-forward +@@deffnx @{Interactive Command@} isearch-backward +These two search commands are similar except @dots{} +@@end deffn +@end group +@end example + +@noindent +produces + +@deffn {Interactive Command} isearch-forward +@deffnx {Interactive Command} isearch-backward +These two search commands are similar except @dots{} +@end deffn + +Each of the other definition commands has an `x' form: @code{@@defunx}, +@code{@@defvrx}, @code{@@deftypefunx}, etc. + +The `x' forms work just like @code{@@itemx}; see @ref{itemx, , @code{@@itemx}}. + +@node Def Cmds in Detail, Def Cmd Conventions, deffnx, Definition Commands +@section The Definition Commands + +Texinfo provides more than a dozen definition commands, all of which +are described in this section.@refill + +The definition commands automatically enter the name of the entity in +the appropriate index: for example, @code{@@deffn}, @code{@@defun}, +and @code{@@defmac} enter function names in the index of functions; +@code{@@defvr} and @code{@@defvar} enter variable names in the index +of variables.@refill + +Although the examples that follow mostly illustrate Lisp, the commands +can be used for other programming languages.@refill + +@menu +* Functions Commands:: Commands for functions and similar entities. +* Variables Commands:: Commands for variables and similar entities. +* Typed Functions:: Commands for functions in typed languages. +* Typed Variables:: Commands for variables in typed languages. +* Abstract Objects:: Commands for object-oriented programming. +* Data Types:: The definition command for data types. +@end menu + +@node Functions Commands, Variables Commands, Def Cmds in Detail, Def Cmds in Detail +@subsection Functions and Similar Entities + +This section describes the commands for describing functions and similar +entities:@refill + +@table @code +@findex deffn +@item @@deffn @var{category} @var{name} @var{arguments}@dots{} +The @code{@@deffn} command is the general definition command for +functions, interactive commands, and similar entities that may take +arguments. You must choose a term to describe the category of entity +being defined; for example, ``Function'' could be used if the entity is +a function. The @code{@@deffn} command is written at the beginning of a +line and is followed on the same line by the category of entity being +described, the name of this particular entity, and its arguments, if +any. Terminate the definition with @code{@@end deffn} on a line of its +own.@refill + +@need 750 +For example, here is a definition: + +@example +@group +@@deffn Command forward-char nchars +Move point forward @@var@{nchars@} characters. +@@end deffn +@end group +@end example + +@noindent +This shows a rather terse definition for a ``command'' named +@code{forward-char} with one argument, @var{nchars}. + +@code{@@deffn} prints argument names such as @var{nchars} in italics or +upper case, as if @code{@@var} had been used, because we think of these +names as metasyntactic variables---they stand for the actual argument +values. Within the text of the description, write an argument name +explicitly with @code{@@var} to refer to the value of the argument. In +the example above, we used @samp{@@var@{nchars@}} in this way. + +The template for @code{@@deffn} is: + +@example +@group +@@deffn @var{category} @var{name} @var{arguments}@dots{} +@var{body-of-definition} +@@end deffn +@end group +@end example + +@findex defun +@item @@defun @var{name} @var{arguments}@dots{} +The @code{@@defun} command is the definition command for functions. +@code{@@defun} is equivalent to @samp{@@deffn Function +@dots{}}.@refill + +@need 800 +@noindent +For example, + +@example +@group +@@defun set symbol new-value +Change the value of the symbol @@var@{symbol@} +to @@var@{new-value@}. +@@end defun +@end group +@end example + +@noindent +shows a rather terse definition for a function @code{set} whose +arguments are @var{symbol} and @var{new-value}. The argument names on +the @code{@@defun} line automatically appear in italics or upper case as +if they were enclosed in @code{@@var}. Terminate the definition with +@code{@@end defun} on a line of its own.@refill + +The template is: + +@example +@group +@@defun @var{function-name} @var{arguments}@dots{} +@var{body-of-definition} +@@end defun +@end group +@end example + +@code{@@defun} creates an entry in the index of functions. + +@findex defmac +@item @@defmac @var{name} @var{arguments}@dots{} +The @code{@@defmac} command is the definition command for macros. +@code{@@defmac} is equivalent to @samp{@@deffn Macro @dots{}} and +works like @code{@@defun}.@refill + +@findex defspec +@item @@defspec @var{name} @var{arguments}@dots{} +The @code{@@defspec} command is the definition command for special +forms. (In Lisp, a special form is an entity much like a function, +@pxref{Special Forms,,, elisp, GNU Emacs Lisp Reference Manual}.) +@code{@@defspec} is equivalent to @samp{@@deffn @{Special Form@} +@dots{}} and works like @code{@@defun}.@refill +@end table + +@node Variables Commands, Typed Functions, Functions Commands, Def Cmds in Detail +@subsection Variables and Similar Entities + +Here are the commands for defining variables and similar +entities:@refill + +@table @code +@findex defvr +@item @@defvr @var{category} @var{name} +The @code{@@defvr} command is a general definition command for +something like a variable---an entity that records a value. You must +choose a term to describe the category of entity being defined; for +example, ``Variable'' could be used if the entity is a variable. +Write the @code{@@defvr} command at the beginning of a line and +followed it on the same line by the category of the entity and the +name of the entity.@refill + +Capitalize the category name like a title. If the name of the category +contains spaces, as in the name ``User Option'', enclose it in braces. +Otherwise, the second word will be mistaken for the name of the entity. +For example, + +@example +@group +@@defvr @{User Option@} fill-column +This buffer-local variable specifies +the maximum width of filled lines. +@dots{} +@@end defvr +@end group +@end example + +Terminate the definition with @code{@@end defvr} on a line of its +own.@refill + +The template is: + +@example +@group +@@defvr @var{category} @var{name} +@var{body-of-definition} +@@end defvr +@end group +@end example + +@code{@@defvr} creates an entry in the index of variables for @var{name}. + +@findex defvar +@item @@defvar @var{name} +The @code{@@defvar} command is the definition command for variables. +@code{@@defvar} is equivalent to @samp{@@defvr Variable +@dots{}}.@refill + +@need 750 +For example: + +@example +@group +@@defvar kill-ring +@dots{} +@@end defvar +@end group +@end example + +The template is: + +@example +@group +@@defvar @var{name} +@var{body-of-definition} +@@end defvar +@end group +@end example + +@code{@@defvar} creates an entry in the index of variables for +@var{name}.@refill + +@findex defopt +@item @@defopt @var{name} +@cindex User options, marking +The @code{@@defopt} command is the definition command for @dfn{user +options}, i.e., variables intended for users to change according to +taste; Emacs has many such (@pxref{Variables,,, emacs, The GNU Emacs +Manual}). @code{@@defopt} is equivalent to @samp{@@defvr @{User +Option@} @dots{}} and works like @code{@@defvar}.@refill +@end table + + +@node Typed Functions, Typed Variables, Variables Commands, Def Cmds in Detail +@subsection Functions in Typed Languages + +The @code{@@deftypefn} command and its variations are for describing +functions in languages in which you must declare types of variables and +functions, such as C and C++. + +@table @code +@findex deftypefn +@item @@deftypefn @var{category} @var{data-type} @var{name} @var{arguments}@dots{} +The @code{@@deftypefn} command is the general definition command for +functions and similar entities that may take arguments and that are +typed. The @code{@@deftypefn} command is written at the beginning of +a line and is followed on the same line by the category of entity +being described, the type of the returned value, the name of this +particular entity, and its arguments, if any.@refill + +@need 800 +@noindent +For example, + +@example +@group +@@deftypefn @{Library Function@} int foobar + (int @@var@{foo@}, float @@var@{bar@}) +@dots{} +@@end deftypefn +@end group +@end example + +@need 1000 +@noindent +(where the text before the ``@dots{}'', shown above as two lines, would +actually be a single line in a real Texinfo file) produces the following +in Info: + +@smallexample +@group +-- Library Function: int foobar (int FOO, float BAR) +@dots{} +@end group +@end smallexample +@iftex + +In a printed manual, it produces: + +@quotation +@deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) +@dots{} +@end deftypefn +@end quotation +@end iftex + +This means that @code{foobar} is a ``library function'' that returns an +@code{int}, and its arguments are @var{foo} (an @code{int}) and +@var{bar} (a @code{float}).@refill + +The argument names that you write in @code{@@deftypefn} are not subject +to an implicit @code{@@var}---since the actual names of the arguments in +@code{@@deftypefn} are typically scattered among data type names and +keywords, Texinfo cannot find them without help. Instead, you must write +@code{@@var} explicitly around the argument names. In the example +above, the argument names are @samp{foo} and @samp{bar}.@refill + +The template for @code{@@deftypefn} is:@refill + +@example +@group +@@deftypefn @var{category} @var{data-type} @var{name} @var{arguments} @dots{} +@var{body-of-description} +@@end deftypefn +@end group +@end example + +@noindent +Note that if the @var{category} or @var{data type} is more than one +word then it must be enclosed in braces to make it a single argument.@refill + +If you are describing a procedure in a language that has packages, +such as Ada, you might consider using @code{@@deftypefn} in a manner +somewhat contrary to the convention described in the preceding +paragraphs.@refill + +@need 800 +@noindent +For example: + +@example +@group +@@deftypefn stacks private push + (@@var@{s@}:in out stack; + @@var@{n@}:in integer) +@dots{} +@@end deftypefn +@end group +@end example + +@noindent +(The @code{@@deftypefn} arguments are shown split into three lines, but +would be a single line in a real Texinfo file.) + +In this instance, the procedure is classified as belonging to the +package @code{stacks} rather than classified as a `procedure' and its +data type is described as @code{private}. (The name of the procedure +is @code{push}, and its arguments are @var{s} and @var{n}.)@refill + +@code{@@deftypefn} creates an entry in the index of functions for +@var{name}.@refill + +@item @@deftypefun @var{data-type} @var{name} @var{arguments}@dots{} +@findex deftypefun +The @code{@@deftypefun} command is the specialized definition command +for functions in typed languages. The command is equivalent to +@samp{@@deftypefn Function @dots{}}.@refill + +@need 800 +@noindent +Thus, + +@smallexample +@group +@@deftypefun int foobar (int @@var@{foo@}, float @@var@{bar@}) +@dots{} +@@end deftypefun +@end group +@end smallexample + +@noindent +produces the following in Info: + +@example +@group +-- Function: int foobar (int FOO, float BAR) +@dots{} +@end group +@end example +@iftex + +@need 800 +@noindent +and the following in a printed manual: + +@quotation +@deftypefun int foobar (int @var{foo}, float @var{bar}) +@dots{} +@end deftypefun +@end quotation +@end iftex + +@need 800 +The template is: + +@example +@group +@@deftypefun @var{type} @var{name} @var{arguments}@dots{} +@var{body-of-description} +@@end deftypefun +@end group +@end example + +@code{@@deftypefun} creates an entry in the index of functions for +@var{name}.@refill + +@item @@deftypemethod @var{class} @var{data-type} @var{method-name} @var{arguments}@dots{} +@findex deftypefun +The @code{@@deftypemethod} command is the definition command for methods +in object-oriented typed languages, such as C++ and Java. It is similar +to the @code{@@deftypefn} with the addition of the @var{class} parameter +to specify the class containing the method. + +@end table + + +@node Typed Variables, Abstract Objects, Typed Functions, Def Cmds in Detail +@subsection Variables in Typed Languages + +Variables in typed languages are handled in a manner similar to +functions in typed languages. @xref{Typed Functions}. The general +definition command @code{@@deftypevr} corresponds to +@code{@@deftypefn} and the specialized definition command +@code{@@deftypevar} corresponds to @code{@@deftypefun}.@refill + +@table @code +@findex deftypevr +@item @@deftypevr @var{category} @var{data-type} @var{name} +The @code{@@deftypevr} command is the general definition command for +something like a variable in a typed language---an entity that records +a value. You must choose a term to describe the category of the +entity being defined; for example, ``Variable'' could be used if the +entity is a variable.@refill + +The @code{@@deftypevr} command is written at the beginning of a line +and is followed on the same line by the category of the entity +being described, the data type, and the name of this particular +entity.@refill + +@need 800 +@noindent +For example: + +@example +@group +@@deftypevr @{Global Flag@} int enable +@dots{} +@@end deftypevr +@end group +@end example + +@noindent +produces the following in Info: + +@example +@group +-- Global Flag: int enable +@dots{} +@end group +@end example +@iftex + +@noindent +and the following in a printed manual: + +@quotation +@deftypevr {Global Flag} int enable +@dots{} +@end deftypevr +@end quotation +@end iftex + +@need 800 +The template is: + +@example +@@deftypevr @var{category} @var{data-type} @var{name} +@var{body-of-description} +@@end deftypevr +@end example + +@code{@@deftypevr} creates an entry in the index of variables for +@var{name}.@refill + +@findex deftypevar +@item @@deftypevar @var{data-type} @var{name} +The @code{@@deftypevar} command is the specialized definition command +for variables in typed languages. @code{@@deftypevar} is equivalent +to @samp{@@deftypevr Variable @dots{}}.@refill + +@need 800 +@noindent +For example: + +@example +@group +@@deftypevar int fubar +@dots{} +@@end deftypevar +@end group +@end example + +@noindent +produces the following in Info: + +@example +@group +-- Variable: int fubar +@dots{} +@end group +@end example +@iftex + +@need 800 +@noindent +and the following in a printed manual: + +@quotation +@deftypevar int fubar +@dots{} +@end deftypevar +@end quotation +@end iftex + +@need 800 +@noindent +The template is: + +@example +@group +@@deftypevar @var{data-type} @var{name} +@var{body-of-description} +@@end deftypevar +@end group +@end example + +@code{@@deftypevar} creates an entry in the index of variables for +@var{name}.@refill +@end table + +@node Abstract Objects, Data Types, Typed Variables, Def Cmds in Detail +@subsection Object-Oriented Programming + +Here are the commands for formatting descriptions about abstract +objects, such as are used in object-oriented programming. A class is +a defined type of abstract object. An instance of a class is a +particular object that has the type of the class. An instance +variable is a variable that belongs to the class but for which each +instance has its own value.@refill + +In a definition, if the name of a class is truly a name defined in the +programming system for a class, then you should write an @code{@@code} +around it. Otherwise, it is printed in the usual text font.@refill + +@table @code +@findex defcv +@item @@defcv @var{category} @var{class} @var{name} +The @code{@@defcv} command is the general definition command for +variables associated with classes in object-oriented programming. The +@code{@@defcv} command is followed by three arguments: the category of +thing being defined, the class to which it belongs, and its +name. Thus,@refill + +@example +@group +@@defcv @{Class Option@} Window border-pattern +@dots{} +@@end defcv +@end group +@end example + +@noindent +illustrates how you would write the first line of a definition of the +@code{border-pattern} class option of the class @code{Window}.@refill + +The template is + +@example +@group +@@defcv @var{category} @var{class} @var{name} +@dots{} +@@end defcv +@end group +@end example + +@code{@@defcv} creates an entry in the index of variables. + +@findex defivar +@item @@defivar @var{class} @var{name} +The @code{@@defivar} command is the definition command for instance +variables in object-oriented programming. @code{@@defivar} is +equivalent to @samp{@@defcv @{Instance Variable@} @dots{}}@refill + +The template is: + +@example +@group +@@defivar @var{class} @var{instance-variable-name} +@var{body-of-definition} +@@end defivar +@end group +@end example + +@code{@@defivar} creates an entry in the index of variables. + +@findex defop +@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} +The @code{@@defop} command is the general definition command for +entities that may resemble methods in object-oriented programming. +These entities take arguments, as functions do, but are associated +with particular classes of objects.@refill + +For example, some systems have constructs called @dfn{wrappers} that +are associated with classes as methods are, but that act more like +macros than like functions. You could use @code{@@defop Wrapper} to +describe one of these.@refill + +Sometimes it is useful to distinguish methods and @dfn{operations}. +You can think of an operation as the specification for a method. +Thus, a window system might specify that all window classes have a +method named @code{expose}; we would say that this window system +defines an @code{expose} operation on windows in general. Typically, +the operation has a name and also specifies the pattern of arguments; +all methods that implement the operation must accept the same +arguments, since applications that use the operation do so without +knowing which method will implement it.@refill + +Often it makes more sense to document operations than methods. For +example, window application developers need to know about the +@code{expose} operation, but need not be concerned with whether a +given class of windows has its own method to implement this operation. +To describe this operation, you would write:@refill + +@example +@@defop Operation windows expose +@end example + +The @code{@@defop} command is written at the beginning of a line and +is followed on the same line by the overall name of the category of +operation, the name of the class of the operation, the name of the +operation, and its arguments, if any.@refill + +@need 800 +@noindent +The template is: + +@example +@group +@@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} +@var{body-of-definition} +@@end defop +@end group +@end example + +@code{@@defop} creates an entry, such as `@code{expose} on +@code{windows}', in the index of functions.@refill + +@item @@defmethod @var{class} @var{name} @var{arguments}@dots{} +@findex defmethod +The @code{@@defmethod} command is the definition command for methods +in object-oriented programming. A method is a kind of function that +implements an operation for a particular class of objects and its +subclasses. In the Lisp Machine, methods actually were functions, but +they were usually defined with @code{defmethod}. + +@code{@@defmethod} is equivalent to @samp{@@defop Method @dots{}}. +The command is written at the beginning of a line and is followed by +the name of the class of the method, the name of the method, and its +arguments, if any.@refill + +@need 800 +@noindent +For example, + +@example +@group +@@defmethod @code{bar-class} bar-method argument +@dots{} +@@end defmethod +@end group +@end example + +@noindent +illustrates the definition for a method called @code{bar-method} of +the class @code{bar-class}. The method takes an argument.@refill + +The template is: + +@example +@group +@@defmethod @var{class} @var{method-name} @var{arguments}@dots{} +@var{body-of-definition} +@@end defmethod +@end group +@end example + +@code{@@defmethod} creates an entry, such as `@code{bar-method} on +@code{bar-class}', in the index of functions.@refill + +@item @@deftypemethod @var{class} @var{data-type} @var{name} @var{arguments}@dots{} +@findex defmethod +The @code{@@deftypemethod} command is the definition command for methods +in object-oriented typed languages, such as C++ and Java. It is similar +to the @code{@@defmethod} command with the addition of the +@var{data-type} parameter to specify the return type of the method. + +@end table + + +@node Data Types, , Abstract Objects, Def Cmds in Detail +@subsection Data Types + +Here is the command for data types:@refill + +@table @code +@findex deftp +@item @@deftp @var{category} @var{name} @var{attributes}@dots{} +The @code{@@deftp} command is the generic definition command for data +types. The command is written at the beginning of a line and is +followed on the same line by the category, by the name of the type +(which is a word like @code{int} or @code{float}), and then by names of +attributes of objects of that type. Thus, you could use this command +for describing @code{int} or @code{float}, in which case you could use +@code{data type} as the category. (A data type is a category of +certain objects for purposes of deciding which operations can be +performed on them.)@refill + +In Lisp, for example, @dfn{pair} names a particular data +type, and an object of that type has two slots called the +@sc{car} and the @sc{cdr}. Here is how you would write the first line +of a definition of @code{pair}.@refill + +@example +@group +@@deftp @{Data type@} pair car cdr +@dots{} +@@end deftp +@end group +@end example + +@need 950 +The template is: + +@example +@group +@@deftp @var{category} @var{name-of-type} @var{attributes}@dots{} +@var{body-of-definition} +@@end deftp +@end group +@end example + +@code{@@deftp} creates an entry in the index of data types. +@end table + +@node Def Cmd Conventions, Sample Function Definition, Def Cmds in Detail, Definition Commands +@section Conventions for Writing Definitions +@cindex Definition conventions +@cindex Conventions for writing definitions + +When you write a definition using @code{@@deffn}, @code{@@defun}, or +one of the other definition commands, please take care to use +arguments that indicate the meaning, as with the @var{count} argument +to the @code{forward-word} function. Also, if the name of an argument +contains the name of a type, such as @var{integer}, take care that the +argument actually is of that type.@refill + +@node Sample Function Definition, , Def Cmd Conventions, Definition Commands +@section A Sample Function Definition +@cindex Function definitions +@cindex Command definitions +@cindex Macro definitions +@cindex Sample function definition + +A function definition uses the @code{@@defun} and @code{@@end defun} +commands. The name of the function follows immediately after the +@code{@@defun} command and it is followed, on the same line, by the +parameter list.@refill + +Here is a definition from @ref{Calling Functions,,, elisp, The GNU Emacs +Lisp Reference Manual}. + +@quotation +@defun apply function &rest arguments +@code{apply} calls @var{function} with @var{arguments}, just +like @code{funcall} but with one difference: the last of +@var{arguments} is a list of arguments to give to +@var{function}, rather than a single argument. We also say +that this list is @dfn{appended} to the other arguments. + +@code{apply} returns the result of calling @var{function}. +As with @code{funcall}, @var{function} must either be a Lisp +function or a primitive function; special forms and macros +do not make sense in @code{apply}. + +@example +(setq f 'list) + @result{} list +(apply f 'x 'y 'z) +@error{} Wrong type argument: listp, z +(apply '+ 1 2 '(3 4)) + @result{} 10 +(apply '+ '(1 2 3 4)) + @result{} 10 + +(apply 'append '((a b c) nil (x y z) nil)) + @result{} (a b c x y z) +@end example + +An interesting example of using @code{apply} is found in the description +of @code{mapcar}.@refill +@end defun +@end quotation + +@need 1200 +In the Texinfo source file, this example looks like this: + +@example +@group +@@defun apply function &rest arguments + +@@code@{apply@} calls @@var@{function@} with +@@var@{arguments@}, just like @@code@{funcall@} but with one +difference: the last of @@var@{arguments@} is a list of +arguments to give to @@var@{function@}, rather than a single +argument. We also say that this list is @@dfn@{appended@} +to the other arguments. +@end group + +@group +@@code@{apply@} returns the result of calling +@@var@{function@}. As with @@code@{funcall@}, +@@var@{function@} must either be a Lisp function or a +primitive function; special forms and macros do not make +sense in @@code@{apply@}. +@end group + +@group +@@example +(setq f 'list) + @@result@{@} list +(apply f 'x 'y 'z) +@@error@{@} Wrong type argument: listp, z +(apply '+ 1 2 '(3 4)) + @@result@{@} 10 +(apply '+ '(1 2 3 4)) + @@result@{@} 10 + +(apply 'append '((a b c) nil (x y z) nil)) + @@result@{@} (a b c x y z) +@@end example +@end group + +@group +An interesting example of using @@code@{apply@} is found +in the description of @@code@{mapcar@}.@@refill +@@end defun +@end group +@end example + +@noindent +In this manual, this function is listed in the Command and Variable +Index under @code{apply}.@refill + +Ordinary variables and user options are described using a format like +that for functions except that variables do not take arguments. + + +@node Footnotes, Conditionals, Definition Commands, Top +@chapter Footnotes +@cindex Footnotes +@findex footnote + +A @dfn{footnote} is for a reference that documents or elucidates the +primary text.@footnote{A footnote should complement or expand upon +the primary text, but a reader should not need to read a footnote to +understand the primary text. For a thorough discussion of footnotes, +see @cite{The Chicago Manual of Style}, which is published by the +University of Chicago Press.}@refill + +@menu +* Footnote Commands:: How to write a footnote in Texinfo. +* Footnote Styles:: Controlling how footnotes appear in Info. +@end menu + +@node Footnote Commands, Footnote Styles, Footnotes, Footnotes +@section Footnote Commands + +In Texinfo, footnotes are created with the @code{@@footnote} command. +This command is followed immediately by a left brace, then by the text +of the footnote, and then by a terminating right brace. Footnotes may +be of any length (they will be broken across pages if necessary), but +are usually short. The template is: + +@example +ordinary text@@footnote@{@var{text of footnote}@} +@end example + +As shown here, the @code{@@footnote} command should come right after the +text being footnoted, with no intervening space; otherwise, the +formatters the footnote mark might end up starting up a line. + +For example, this clause is followed by a sample +footnote@footnote{Here is the sample footnote.}; in the Texinfo +source, it looks like this:@refill + +@example +@dots{}a sample footnote@@footnote@{Here is the sample +footnote.@}; in the Texinfo source@dots{} +@end example + +@strong{Warning:} Don't use footnotes in the argument of the +@code{@@item} command for a @code{@@table} table. This doesn't work, and +because of limitations of @TeX{}, there is no way to fix it. You must +put the footnote into the body text of the table. + +In a printed manual or book, the reference mark for a footnote is a +small, superscripted number; the text of the footnote appears at the +bottom of the page, below a horizontal line.@refill + +In Info, the reference mark for a footnote is a pair of parentheses +with the footnote number between them, like this: @samp{(1)}.@refill + + +@node Footnote Styles, , Footnote Commands, Footnotes +@section Footnote Styles + +Info has two footnote styles, which determine where the text of the +footnote is located:@refill + +@itemize @bullet +@cindex @samp{@r{End}} node footnote style +@item +In the `End' node style, all the footnotes for a single node +are placed at the end of that node. The footnotes are separated from +the rest of the node by a line of dashes with the word +@samp{Footnotes} within it. Each footnote begins with an +@samp{(@var{n})} reference mark.@refill + +@need 700 +@noindent +Here is an example of a single footnote in the end of node style:@refill + +@example +@group + --------- Footnotes --------- + +(1) Here is a sample footnote. +@end group +@end example + +@cindex @samp{@r{Separate}} footnote style +@item +In the `Separate' node style, all the footnotes for a single +node are placed in an automatically constructed node of +their own. In this style, a ``footnote reference'' follows +each @samp{(@var{n})} reference mark in the body of the +node. The footnote reference is actually a cross reference +which you use to reach the footnote node.@refill + +The name of the node containing the footnotes is constructed +by appending @w{@samp{-Footnotes}} to the name of the node +that contains the footnotes. (Consequently, the footnotes' +node for the @file{Footnotes} node is +@w{@file{Footnotes-Footnotes}}!) The footnotes' node has an +`Up' node pointer that leads back to its parent node.@refill + +@noindent +Here is how the first footnote in this manual looks after being +formatted for Info in the separate node style:@refill + +@smallexample +@group +File: texinfo.info Node: Overview-Footnotes, Up: Overview + +(1) Note that the first syllable of "Texinfo" is +pronounced like "speck", not "hex". @dots{} +@end group +@end smallexample +@end itemize + +A Texinfo file may be formatted into an Info file with either footnote +style.@refill + +@findex footnotestyle +Use the @code{@@footnotestyle} command to specify an Info file's +footnote style. Write this command at the beginning of a line followed +by an argument, either @samp{end} for the end node style or +@samp{separate} for the separate node style. + +@need 700 +For example, + +@example +@@footnotestyle end +@end example +@noindent +or +@example +@@footnotestyle separate +@end example + +Write an @code{@@footnotestyle} command before or shortly after the +end-of-header line at the beginning of a Texinfo file. (If you +include the @code{@@footnotestyle} command between the start-of-header +and end-of-header lines, the region formatting commands will format +footnotes as specified.)@refill + +If you do not specify a footnote style, the formatting commands use +their default style. Currently, @code{texinfo-format-buffer} and +@code{texinfo-format-region} use the `separate' style and +@code{makeinfo} uses the `end' style.@refill + +@c !!! note: makeinfo's --footnote-style option overrides footnotestyle +@ignore +If you use @code{makeinfo} to create the Info file, the +@samp{--footnote-style} option determines which style is used, +@samp{end} for the end of node style or @samp{separate} for the +separate node style. Thus, to format the Texinfo manual in the +separate node style, you would use the following shell command:@refill + +@example +makeinfo --footnote-style=separate texinfo.texi +@end example + +@noindent +To format the Texinfo manual in the end of node style, you would +type:@refill + +@example +makeinfo --footnote-style=end texinfo.texi +@end example +@end ignore +@ignore +If you use @code{texinfo-format-buffer} or +@code{texinfo-format-region} to create the Info file, the value of the +@code{texinfo-footnote-style} variable controls the footnote style. +It can be either @samp{"separate"} for the separate node style or +@samp{"end"} for the end of node style. (You can change the value of +this variable with the @kbd{M-x edit-options} command (@pxref{Edit +Options, , Editing Variable Values, emacs, The GNU Emacs Manual}), or +with the @kbd{M-x set-variable} command (@pxref{Examining, , Examining +and Setting Variables, emacs, The GNU Emacs Manual}).@refill + +The @code{texinfo-footnote-style} variable also controls the style if +you use the @kbd{M-x makeinfo-region} or @kbd{M-x makeinfo-buffer} +command in Emacs.@refill +@end ignore +This chapter contains two footnotes.@refill + + +@node Conditionals, Macros, Footnotes, Top +@comment node-name, next, previous, up +@chapter Conditionally Visible Text +@cindex Conditionally visible text +@cindex Text, conditionally visible +@cindex Visibility of conditional text +@cindex If text conditionally visible + +Sometimes it is good to use different text for a printed manual and +its corresponding Info file. In this case, you can use the +@dfn{conditional commands} to specify which text is for the printed manual +and which is for the Info file.@refill + +@menu +* Conditional Commands:: Specifying text for HTML, Info, or @TeX{}. +* Conditional Not Commands:: Specifying text for not HTML, Info, or @TeX{}. +* Raw Formatter Commands:: Using raw @TeX{} or HTML commands. +* set clear value:: Designating which text to format (for + all output formats); and how to set a + flag to a string that you can insert. +@end menu + +@node Conditional Commands, Conditional Not Commands, Conditionals, Conditionals +@ifinfo +@heading Conditional Commands +@end ifinfo + +@findex ifinfo +@code{@@ifinfo} begins segments of text that should be ignored +by @TeX{} when it +typesets the printed manual. The segment of text appears only +in the Info file. +The @code{@@ifinfo} command should appear on a line by itself; end +the Info-only text with a line containing @code{@@end ifinfo} by +itself. At the beginning of a Texinfo file, the Info permissions are +contained within a region marked by @code{@@ifinfo} and @code{@@end +ifinfo}. (@xref{Info Summary and Permissions}.)@refill + +@findex iftex +@findex ifhtml +The @code{@@iftex} and @code{@@end iftex} commands are similar to the +@code{@@ifinfo} and @code{@@end ifinfo} commands, except that they +specify text that will appear in the printed manual but not in the Info +file. Likewise for @code{@@ifhtml} and @code{@@end ifhtml}, which +specify text to appear only in HTML output.@refill + +For example, + +@example +@@iftex +This text will appear only in the printed manual. +@@end iftex +@@ifinfo +However, this text will appear only in Info. +@@end ifinfo +@end example + +@noindent +The preceding example produces the following line: +@iftex +This text will appear only in the printed manual. +@end iftex +@ifinfo +However, this text will appear only in Info. +@end ifinfo + +@noindent +Note how you only see one of the two lines, depending on whether you +are reading the Info version or the printed version of this +manual.@refill + +The @code{@@titlepage} command is a special variant of @code{@@iftex} that +is used for making the title and copyright pages of the printed +manual. (@xref{titlepage, , @code{@@titlepage}}.) @refill + + +@node Conditional Not Commands, Raw Formatter Commands, Conditional Commands, Conditionals +@section Conditional Not Commands +@findex ifnothtml +@findex ifnotinfo +@findex ifnottex + +You can specify text to be included in any output format @emph{other} +than some given one with the @code{@@ifnot@dots{}} commands: +@example +@@ifnothtml @dots{} @@end ifnothtml +@@ifnotinfo @dots{} @@end ifnotinfo +@@ifnottex @dots{} @@end ifnottex +@end example +@noindent +(The @code{@@ifnot@dots{}} command and the @code{@@end} command must +actually appear on lines by themselves.) + +If the output file is not being made for the given format, the region is +included. Otherwise, it is ignored. + +The regions delimited by these commands are ordinary Texinfo source as +with @code{@@iftex}, not raw formatter source as with @code{@@tex}. + + +@node Raw Formatter Commands, set clear value, Conditional Not Commands, Conditionals +@section Raw Formatter Commands +@cindex @TeX{} commands, using ordinary +@cindex HTML commands, using ordinary +@cindex Raw formatter commands +@cindex Ordinary @TeX{} commands, using +@cindex Ordinary HTML commands, using +@cindex Commands using raw @TeX{} +@cindex Commands using raw HTML +@cindex plain @TeX{} + +Inside a region delineated by @code{@@iftex} and @code{@@end iftex}, you +can embed some raw @TeX{} commands. Info will ignore these commands +since they are only in that part of the file which is seen by @TeX{}. +You can write the @TeX{} commands as you would write them in a normal +@TeX{} file, except that you must replace the @samp{\} used by @TeX{} +with an @samp{@@}. For example, in the @code{@@titlepage} section of a +Texinfo file, you can use the @TeX{} command @code{@@vskip} to format +the copyright page. (The @code{@@titlepage} command causes Info to +ignore the region automatically, as it does with the @code{@@iftex} +command.) + +However, many features of plain @TeX{} will not work, as they are +overridden by Texinfo features. + +@findex tex +You can enter plain @TeX{} completely, and use @samp{\} in the @TeX{} +commands, by delineating a region with the @code{@@tex} and @code{@@end +tex} commands. (The @code{@@tex} command also causes Info to ignore the +region, like the @code{@@iftex} command.) The sole exception is that +@code{@@} chracter still introduces a command, so that @code{@@end tex} +can be recognized properly. + +@cindex Mathematical expressions +For example, here is a mathematical expression written in +plain @TeX{}: + +@example +@@tex +$$ \chi^2 = \sum_@{i=1@}^N + \left (y_i - (a + b x_i) + \over \sigma_i\right)^2 $$ +@@end tex +@end example + +@noindent +The output of this example will appear only in a printed manual. If +you are reading this in Info, you will not see the equation that appears +in the printed manual. +@iftex +In a printed manual, the above expression looks like +this: +@end iftex + +@tex +$$ \chi^2 = \sum_{i=1}^N + \left(y_i - (a + b x_i) + \over \sigma_i\right)^2 $$ +@end tex + +@findex ifhtml +@findex html +Analogously, you can use @code{@@ifhtml @dots{} @@end ifhtml} to delimit +a region to be included in HTML output only, and @code{@@html @dots{} +@@end ifhtml} for a region of raw HTML (again, except that @code{@@} is +still the escape character, so the @code{@@end} command can be +recognized.) + + +@node set clear value, , Raw Formatter Commands, Conditionals +@comment node-name, next, previous, up +@section @code{@@set}, @code{@@clear}, and @code{@@value} + +You can direct the Texinfo formatting commands to format or ignore parts +of a Texinfo file with the @code{@@set}, @code{@@clear}, @code{@@ifset}, +and @code{@@ifclear} commands.@refill + +In addition, you can use the @code{@@set @var{flag}} command to set the +value of @var{flag} to a string of characters; and use +@code{@@value@{@var{flag}@}} to insert that string. You can use +@code{@@set}, for example, to set a date and use @code{@@value} to +insert the date in several places in the Texinfo file.@refill + +@menu +* ifset ifclear:: Format a region if a flag is set. +* value:: Replace a flag with a string. +* value Example:: An easy way to update edition information. +@end menu + + +@node ifset ifclear, value, set clear value, set clear value +@subsection @code{@@ifset} and @code{@@ifclear} + +@findex ifset +When a @var{flag} is set, the Texinfo formatting commands format text +between subsequent pairs of @code{@@ifset @var{flag}} and @code{@@end +ifset} commands. When the @var{flag} is cleared, the Texinfo formatting +commands do @emph{not} format the text. + +Use the @code{@@set @var{flag}} command to turn on, or @dfn{set}, a +@var{flag}; a @dfn{flag} can be any single word. The format for the +command looks like this:@refill +@findex set + +@example +@@set @var{flag} +@end example + +Write the conditionally formatted text between @code{@@ifset @var{flag}} +and @code{@@end ifset} commands, like this:@refill + +@example +@group +@@ifset @var{flag} +@var{conditional-text} +@@end ifset +@end group +@end example + +For example, you can create one document that has two variants, such as +a manual for a `large' and `small' model:@refill + +@example +You can use this machine to dig up shrubs +without hurting them. + +@@set large + +@@ifset large +It can also dig up fully grown trees. +@@end ifset + +Remember to replant promptly @dots{} +@end example + +@noindent +In the example, the formatting commands will format the text between +@code{@@ifset large} and @code{@@end ifset} because the @code{large} +flag is set.@refill + +@findex clear +Use the @code{@@clear @var{flag}} command to turn off, or @dfn{clear}, +a flag. Clearing a flag is the opposite of setting a flag. The +command looks like this:@refill + +@example +@@clear @var{flag} +@end example + +@noindent +Write the command on a line of its own. + +When @var{flag} is cleared, the Texinfo formatting commands do +@emph{not} format the text between @code{@@ifset @var{flag}} and +@code{@@end ifset}; that text is ignored and does not appear in either +printed or Info output.@refill + +For example, if you clear the flag of the preceding example by writing +an @code{@@clear large} command after the @code{@@set large} command +(but before the conditional text), then the Texinfo formatting commands +ignore the text between the @code{@@ifset large} and @code{@@end ifset} +commands. In the formatted output, that text does not appear; in both +printed and Info output, you see only the lines that say, ``You can use +this machine to dig up shrubs without hurting them. Remember to replant +promptly @dots{}''. + +@findex ifclear +If a flag is cleared with an @code{@@clear @var{flag}} command, then +the formatting commands format text between subsequent pairs of +@code{@@ifclear} and @code{@@end ifclear} commands. But if the flag +is set with @code{@@set @var{flag}}, then the formatting commands do +@emph{not} format text between an @code{@@ifclear} and an @code{@@end +ifclear} command; rather, they ignore that text. An @code{@@ifclear} +command looks like this:@refill + +@example +@@ifclear @var{flag} +@end example + +@need 700 +In brief, the commands are:@refill + +@table @code +@item @@set @var{flag} +Tell the Texinfo formatting commands that @var{flag} is set.@refill + +@item @@clear @var{flag} +Tell the Texinfo formatting commands that @var{flag} is cleared.@refill + +@item @@ifset @var{flag} +If @var{flag} is set, tell the Texinfo formatting commands to format +the text up to the following @code{@@end ifset} command.@refill + +If @var{flag} is cleared, tell the Texinfo formatting commands to +ignore text up to the following @code{@@end ifset} command.@refill + +@item @@ifclear @var{flag} +If @var{flag} is set, tell the Texinfo formatting commands to ignore +the text up to the following @code{@@end ifclear} command.@refill + +If @var{flag} is cleared, tell the Texinfo formatting commands to +format the text up to the following @code{@@end ifclear} +command.@refill +@end table + +@node value, value Example, ifset ifclear, set clear value +@subsection @code{@@value} +@findex value + +You can use the @code{@@set} command to specify a value for a flag, +which is expanded by the @code{@@value} command. The value is a string +a characters. + +Write the @code{@@set} command like this: + +@example +@@set foo This is a string. +@end example + +@noindent +This sets the value of @code{foo} to ``This is a string.'' + +The Texinfo formatters replace an @code{@@value@{@var{flag}@}} command with +the string to which @var{flag} is set.@refill + +Thus, when @code{foo} is set as shown above, the Texinfo formatters convert + +@example +@group +@@value@{foo@} +@exdent @r{to} +This is a string. +@end group +@end example + +You can write an @code{@@value} command within a paragraph; but you +must write an @code{@@set} command on a line of its own. + +If you write the @code{@@set} command like this: + +@example +@@set foo +@end example + +@noindent +without specifying a string, the value of @code{foo} is an empty string. + +If you clear a previously set flag with an @code{@@clear @var{flag}} +command, a subsequent @code{@@value@{flag@}} command is invalid and the +string is replaced with an error message that says @samp{@{No value for +"@var{flag}"@}}. + +For example, if you set @code{foo} as follows:@refill + +@example +@@set how-much very, very, very +@end example + +@noindent +then the formatters transform + +@example +@group +It is a @@value@{how-much@} wet day. +@exdent @r{into} +It is a very, very, very wet day. +@end group +@end example + +If you write + +@example +@@clear how-much +@end example + +@noindent +then the formatters transform + +@example +@group +It is a @@value@{how-much@} wet day. +@exdent @r{into} +It is a @{No value for "how-much"@} wet day. +@end group +@end example + +@node value Example, , value, set clear value +@subsection @code{@@value} Example + +You can use the @code{@@value} command to limit the number of places you +need to change when you record an update to a manual. +Here is how it is done in @cite{The GNU Make Manual}: + +@need 1000 +@noindent +Set the flags: + +@example +@group +@@set EDITION 0.35 Beta +@@set VERSION 3.63 Beta +@@set UPDATED 14 August 1992 +@@set UPDATE-MONTH August 1992 +@end group +@end example + +@need 750 +@noindent +Write text for the first @code{@@ifinfo} section, for people reading the +Texinfo file: + +@example +@group +This is Edition @@value@{EDITION@}, +last updated @@value@{UPDATED@}, +of @@cite@{The GNU Make Manual@}, +for @@code@{make@}, Version @@value@{VERSION@}. +@end group +@end example + +@need 1000 +@noindent +Write text for the title page, for people reading the printed manual: +@c List only the month and the year since that looks less fussy on a +@c printed cover than a date that lists the day as well. + +@example +@group +@@title GNU Make +@@subtitle A Program for Directing Recompilation +@@subtitle Edition @@value@{EDITION@}, @dots{} +@@subtitle @@value@{UPDATE-MONTH@} +@end group +@end example + +@noindent +(On a printed cover, a date listing the month and the year looks less +fussy than a date listing the day as well as the month and year.) + +@need 750 +@noindent +Write text for the Top node, for people reading the Info file: + +@example +@group +This is Edition @@value@{EDITION@} +of the @@cite@{GNU Make Manual@}, +last updated @@value@{UPDATED@} +for @@code@{make@} Version @@value@{VERSION@}. +@end group +@end example + +@need 950 +After you format the manual, the text in the first @code{@@ifinfo} +section looks like this: + +@example +@group +This is Edition 0.35 Beta, last updated 14 August 1992, +of `The GNU Make Manual', for `make', Version 3.63 Beta. +@end group +@end example + +When you update the manual, change only the values of the flags; you do +not need to rewrite the three sections. + + +@node Macros, Format/Print Hardcopy, Conditionals, Top +@chapter Macros: Defining New Texinfo Commands +@cindex Macros +@cindex Defining new Texinfo commands +@cindex New Texinfo commands, defining +@cindex Texinfo commands, defining new +@cindex User-defined Texinfo commands + +A Texinfo @dfn{macro} allows you to define a new Texinfo command as any +sequence of text and/or existing commands (including other macros). The +macro can have any number of @dfn{parameters}---text you supply each +time you use the macro. (This has nothing to do with the +@code{@@defmac} command, which is for documenting macros in the subject +of the manual; @pxref{Def Cmd Template}.) + +@menu +* Defining Macros:: Both defining and undefining new commands. +* Invoking Macros:: Using a macro, once you've defined it. +@end menu + + +@node Defining Macros, Invoking Macros, Macros, Macros +@section Defining Macros +@cindex Defining macros +@cindex Macro definitions + +@findex macro +You use the Texinfo @code{@@macro} command to define a macro. For example: + +@example +@@macro @var{macro-name}@{@var{param1}, @var{param2}, @dots{}@} +@var{text} @dots{} \@var{param1}\ @dots{} +@@end macro +@end example + +The @dfn{parameters} @var{param1}, @var{param2}, @dots{} correspond to +arguments supplied when the macro is subsequently used in the document +(see the next section). + +If a macro needs no parameters, you can define it either with an empty +list (@samp{@@macro foo @{@}}) or with no braces at all (@samp{@@macro +foo}). + +@cindex Body of a macro +@cindex Mutually recursive macros +@cindex Recursion, mutual +The definition or @dfn{body} of the macro can contain any Texinfo +commands, including previously-defined macros. (It is not possible to +have mutually recursive Texinfo macros.) In the body, instances of a +parameter name surrounded by backslashes, as in @samp{\@var{param1}\} in +the example above, are replaced by the corresponding argument from the +macro invocation. + +@findex unmacro +@cindex Macros, undefining +@cindex Undefining macros +You can undefine a macro @var{foo} with @code{@@unmacro @var{foo}}. +It is not an error to undefine a macro that is already undefined. +For example: + +@example +@@unmacro foo +@end example + + +@node Invoking Macros, , Defining Macros, Macros +@section Invoking Macros +@cindex Invoking macros +@cindex Macro invocation + +After a macro is defined (see the previous section), you can use +(@dfn{invoke}) it in your document like this: + +@example +@@@var{macro-name} @{@var{arg1}, @var{arg2}, @dots{}@} +@end example + +@noindent and the result will be just as if you typed the body of +@var{macro-name} at that spot. For example: + +@example +@@macro foo @{p, q@} +Together: \p\ & \q\. +@@end macro +@@foo@{a, b@} +@end example + +@noindent produces: + +@display +Together: a & b. +@end display + +@cindex Backslash, and macros +Thus, the arguments and parameters are separated by commas and delimited +by braces; any whitespace after (but not before) a comma is ignored. To +insert a comma, brace, or backslash in an argument, prepend a backslash, +as in + +@example +@@@var{macro-name} @{\\\@{\@}\,@} +@end example + +@noindent +which will pass the (almost certainly error-producing) argument +@samp{\@{@},} to @var{macro-name}. + +If the macro is defined to take a single argument, and is invoked +without any braces, the entire rest of the line after the macro name is +supplied as the argument. For example: + +@example +@@macro bar @{p@} +Twice: \p\, \p\. +@@end macro +@@bar aah +@end example + +@noindent produces: + +@display +Twice: aah, aah. +@end display + + +@node Format/Print Hardcopy, Create an Info File, Macros, Top +@comment node-name, next, previous, up +@chapter Format and Print Hardcopy +@cindex Format and print hardcopy +@cindex Hardcopy, printing it +@cindex Making a printed manual +@cindex Sorting indices +@cindex Indices, sorting +@cindex @TeX{} index sorting +@pindex texindex + +There are three major shell commands for making a printed manual from a +Texinfo file: one for converting the Texinfo file into a file that will be +printed, a second for sorting indices, and a third for printing the +formatted document. When you use the shell commands, you can either +work directly in the operating system shell or work within a shell +inside GNU Emacs.@refill + +If you are using GNU Emacs, you can use commands provided by Texinfo +mode instead of shell commands. In addition to the three commands to +format a file, sort the indices, and print the result, Texinfo mode +offers key bindings for commands to recenter the output buffer, show the +print queue, and delete a job from the print queue.@refill + +@menu +* Use TeX:: Use @TeX{} to format for hardcopy. +* Format with tex/texindex:: How to format in a shell. +* Format with texi2dvi:: A simpler way to use the shell. +* Print with lpr:: How to print. +* Within Emacs:: How to format and print from an Emacs shell. +* Texinfo Mode Printing:: How to format and print in Texinfo mode. +* Compile-Command:: How to print using Emacs's compile command. +* Requirements Summary:: @TeX{} formatting requirements summary. +* Preparing for TeX:: What you need to do to use @TeX{}. +* Overfull hboxes:: What are and what to do with overfull hboxes. +* smallbook:: How to print small format books and manuals. +* A4 Paper:: How to print on European A4 paper. +* Cropmarks and Magnification:: How to print marks to indicate the size + of pages and how to print scaled up output. +@end menu + +@node Use TeX, Format with tex/texindex, Format/Print Hardcopy, Format/Print Hardcopy +@ifinfo +@heading Use @TeX{} +@end ifinfo + +The typesetting program called @TeX{} is used for formatting a Texinfo +file. @TeX{} is a very powerful typesetting program and, if used right, +does an exceptionally good job. (@xref{Obtaining TeX, , How to Obtain +@TeX{}}, for information on how to obtain @TeX{}.) + +The @code{makeinfo}, @code{texinfo-format-region}, and +@code{texinfo-format-buffer} commands read the very same @@-commands +in the Texinfo file as does @TeX{}, but process them differently to +make an Info file; see @ref{Create an Info File}.@refill + +@node Format with tex/texindex, Format with texi2dvi, Use TeX, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Format using @code{tex} and @code{texindex} +@cindex Shell formatting with @code{tex} and @code{texindex} +@cindex Formatting with @code{tex} and @code{texindex} +@cindex DVI file + +Format the Texinfo file with the shell command @code{tex} followed by +the name of the Texinfo file. For example: + +@example +tex foo.texi +@end example + +@noindent @TeX{} will produce a @dfn{DVI file} as well as several auxiliary +files containing information for indices, cross references, etc. The +DVI file (for @dfn{DeVice Independent} file) can be printed on virtually +any printe (see the following sections). + +@pindex texindex +The @code{tex} formatting command itself does not sort the indices; it +writes an output file of unsorted index data. (The @code{texi2dvi} +command automatically generates indices; see @ref{Format with texi2dvi,, +Format using @code{texi2dvi}}.) To generate a printed index after +running the @code{tex} command, you first need a sorted index to work +from. The @code{texindex} command sorts indices. (The source file +@file{texindex.c} comes as part of the standard Texinfo distribution, +among other places.)@refill + +@cindex Names of index files +The @code{tex} formatting command outputs unsorted index files under +names that obey a standard convention: the name of your main input file +with any @samp{.tex} (or similar, @pxref{tex invocation,,, web2c, +Web2c}) extension removed, followed by the two letter names of indices. +For example, the raw index output files for the input file +@file{foo.texinfo} would be @file{foo.cp}, @file{foo.vr}, @file{foo.fn}, +@file{foo.tp}, @file{foo.pg} and @file{foo.ky}. Those are exactly the +arguments to give to @code{texindex}.@refill + +@need 1000 +@cindex Wildcards +@cindex Globbing +Instead of specifying all the unsorted index file names explicitly, you +can use @samp{??} as shell wildcards and give the command in this +form:@refill + +@example +texindex foo.?? +@end example + +@noindent +This command will run @code{texindex} on all the unsorted index files, +including any that you have defined yourself using @code{@@defindex} +or @code{@@defcodeindex}. (You may execute @samp{texindex foo.??} +even if there are similarly named files with two letter extensions +that are not index files, such as @samp{foo.el}. The @code{texindex} +command reports but otherwise ignores such files.)@refill + +For each file specified, @code{texindex} generates a sorted index file +whose name is made by appending @samp{s} to the input file name. The +@code{@@printindex} command knows to look for a file of that name +(@pxref{Printing Indices & Menus}). @code{texindex} does not alter the +raw index output file.@refill + +After you have sorted the indices, you need to rerun the @code{tex} +formatting command on the Texinfo file. This regenerates the DVI file, +this time with up-to-date index entries. + +Finally, you may need to run @code{tex} one more time, to get the page +numbers in the cross-references correct. + +To summarize, this is a four step process: + +@enumerate +@item +Run @code{tex} on your Texinfo file. This generates a DVI file (with +undefined cross-references and no indices), and the raw index files +(with two letter extensions). + +@item +Run @code{texindex} on the raw index files. This creates the +corresponding sorted index files (with three letter extensions). + +@item +Run @code{tex} again on your Texinfo file. This regenerates the DVI +file, this time with indices and defined cross-references, but with page +numbers for the cross-references from last time, generally incorrect. + +@item +Run @code{tex} one last time. This time the correct page numbers are +written for the cross-references. +@end enumerate + +@pindex texi2dvi +Alternatively, it's a one-step process: run @code{texi2dvi}. + +You need not run @code{texindex} each time after you run @code{tex}. If +you do not, on the next run, the @code{tex} formatting command will use +whatever sorted index files happen to exist from the previous use of +@code{texindex}. This is usually ok while you are +debugging.@refill + +@node Format with texi2dvi, Print with lpr, Format with tex/texindex, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Format using @code{texi2dvi} +@pindex texi2dvi @r{(shell script)} + +The @code{texi2dvi} command is a shell script that automatically runs +both @code{tex} and @code{texindex} as many times as necessary to +produce a DVI file with up-to-date, sorted indices. It simplifies the +@code{tex}---@code{texindex}---@code{tex} sequence described in the +previous section. + +@need 1000 +The syntax for @code{texi2dvi} is like this (where @samp{prompt$} is the +shell prompt):@refill + +@example +prompt$ @kbd{texi2dvi @var{filename}@dots{}} +@end example + +@node Print with lpr, Within Emacs, Format with texi2dvi, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Shell Print Using @code{lpr -d} +@pindex lpr @r{(DVI print command)} + +The precise command to print a DVI file depends on your system +installation, but @samp{lpr -d} is common. The command may require the +DVI file name without any extension or with a @samp{.dvi} +extension. (If it is @samp{lpr}, you must include the @samp{.dvi}.) + +The following commands, for example, will (probably) suffice to sort the +indices, format, and print the @cite{Bison Manual}: + +@example +@group +tex bison.texinfo +texindex bison.?? +tex bison.texinfo +lpr -d bison.dvi +@end group +@end example + +@noindent +(Remember that the shell commands may be different at your site; but +these are commonly used versions.)@refill + +@need 1000 +Using the @code{texi2dvi} shell script, you simply need type:@refill + +@example +@group +texi2dvi bison.texinfo +lpr -d bison.dvi +@end group +@end example + +@node Within Emacs, Texinfo Mode Printing, Print with lpr, Format/Print Hardcopy +@comment node-name, next, previous, up +@section From an Emacs Shell +@cindex Print, format from Emacs shell +@cindex Format, print from Emacs shell +@cindex Shell, format, print from +@cindex Emacs shell, format, print from +@cindex GNU Emacs shell, format, print from + +You can give formatting and printing commands from a shell within GNU +Emacs. To create a shell within Emacs, type @kbd{M-x shell}. In this +shell, you can format and print the document. @xref{Format/Print +Hardcopy, , Format and Print Hardcopy}, for details.@refill + +You can switch to and from the shell buffer while @code{tex} is +running and do other editing. If you are formatting a long document +on a slow machine, this can be very convenient.@refill + +You can also use @code{texi2dvi} from an Emacs shell. For example, +here is how to use @code{texi2dvi} to format and print @cite{Using and +Porting GNU CC} from a shell within Emacs: + +@example +@group +texi2dvi gcc.texinfo +lpr -d gcc.dvi +@end group +@end example +@ifinfo + +@xref{Texinfo Mode Printing}, for more information about formatting +and printing in Texinfo mode.@refill +@end ifinfo + +@node Texinfo Mode Printing, Compile-Command, Within Emacs, Format/Print Hardcopy +@section Formatting and Printing in Texinfo Mode +@cindex Region printing in Texinfo mode +@cindex Format and print in Texinfo mode +@cindex Print and format in Texinfo mode + +Texinfo mode provides several predefined key commands for @TeX{} +formatting and printing. These include commands for sorting indices, +looking at the printer queue, killing the formatting job, and +recentering the display of the buffer in which the operations +occur.@refill + +@table @kbd +@item C-c C-t C-b +@itemx M-x texinfo-tex-buffer +Run @code{texi2dvi} on the current buffer.@refill + +@item C-c C-t C-r +@itemx M-x texinfo-tex-region +Run @TeX{} on the current region.@refill + +@item C-c C-t C-i +@itemx M-x texinfo-texindex +Sort the indices of a Texinfo file formatted with +@code{texinfo-tex-region}.@refill + +@item C-c C-t C-p +@itemx M-x texinfo-tex-print +Print a DVI file that was made with @code{texinfo-tex-region} or +@code{texinfo-tex-buffer}.@refill + +@item C-c C-t C-q +@itemx M-x tex-show-print-queue +Show the print queue.@refill + +@item C-c C-t C-d +@itemx M-x texinfo-delete-from-print-queue +Delete a job from the print queue; you will be prompted for the job +number shown by a preceding @kbd{C-c C-t C-q} command +(@code{texinfo-show-tex-print-queue}).@refill + +@item C-c C-t C-k +@itemx M-x tex-kill-job +Kill the currently running @TeX{} job started by +@code{texinfo-tex-region} or @code{texinfo-tex-buffer}, or any other +process running in the Texinfo shell buffer.@refill + +@item C-c C-t C-x +@itemx M-x texinfo-quit-job +Quit a @TeX{} formatting job that has stopped because of an error by +sending an @key{x} to it. When you do this, @TeX{} preserves a record +of what it did in a @file{.log} file.@refill + +@item C-c C-t C-l +@itemx M-x tex-recenter-output-buffer +Redisplay the shell buffer in which the @TeX{} printing and formatting +commands are run to show its most recent output.@refill +@end table + +@need 1000 +Thus, the usual sequence of commands for formatting a buffer is as +follows (with comments to the right):@refill + +@example +@group +C-c C-t C-b @r{Run @code{texi2dvi} on the buffer.} +C-c C-t C-p @r{Print the DVI file.} +C-c C-t C-q @r{Display the printer queue.} +@end group +@end example + +The Texinfo mode @TeX{} formatting commands start a subshell in Emacs +called the @file{*tex-shell*}. The @code{texinfo-tex-command}, +@code{texinfo-texindex-command}, and @code{tex-dvi-print-command} +commands are all run in this shell. + +You can watch the commands operate in the @samp{*tex-shell*} buffer, +and you can switch to and from and use the @samp{*tex-shell*} buffer +as you would any other shell buffer.@refill + +@need 1500 +The formatting and print commands depend on the values of several variables. +The default values are:@refill + +@example +@group + @r{Variable} @r{Default value} + +texinfo-texi2dvi-command "texi2dvi" +texinfo-tex-command "tex" +texinfo-texindex-command "texindex" +texinfo-delete-from-print-queue-command "lprm" +texinfo-tex-trailer "@@bye" +tex-start-of-header "%**start" +tex-end-of-header "%**end" +tex-dvi-print-command "lpr -d" +tex-show-queue-command "lpq" +@end group +@end example + +You can change the values of these variables with the @kbd{M-x +edit-options} command (@pxref{Edit Options, , Editing Variable Values, +emacs, The GNU Emacs Manual}), with the @kbd{M-x set-variable} command +(@pxref{Examining, , Examining and Setting Variables, emacs, The GNU +Emacs Manual}), or with your @file{.emacs} initialization file +(@pxref{Init File, , , emacs, The GNU Emacs Manual}).@refill + +@node Compile-Command, Requirements Summary, Texinfo Mode Printing, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Using the Local Variables List +@cindex Local variables +@cindex Compile command for formatting +@cindex Format with the compile command + +Yet another way to apply the @TeX{} formatting command to a Texinfo file +is to put that command in a @dfn{local variables list} at the end of the +Texinfo file. You can then specify the @code{tex} or @code{texi2dvi} +commands as a @code{compile-command} and have Emacs run it by typing +@kbd{M-x compile}. This creates a special shell called the +@file{*compilation*} buffer in which Emacs runs the compile command. +For example, at the end of the @file{gdb.texinfo} file, after the +@code{@@bye}, you could put the following:@refill + +@example +@group +Local Variables: +compile-command: "texi2dvi gdb.texinfo" +End: +@end group +@end example + +@noindent +This technique is most often used by programmers who also compile programs +this way; see @ref{Compilation, , , emacs, The GNU Emacs Manual}.@refill + + +@node Requirements Summary, Preparing for TeX, Compile-Command, Format/Print Hardcopy +@comment node-name, next, previous, up +@section @TeX{} Formatting Requirements Summary +@cindex Requirements for formatting +@cindex Minimal requirements for formatting +@cindex Formatting requirements + +Every Texinfo file that is to be input to @TeX{} must begin with a +@code{\input} command and must contain an @code{@@setfilename} command: + +@example +\input texinfo +@@setfilename @var{arg-not-used-by-@TeX{}} +@end example + +@noindent +The first command instructs @TeX{} to load the macros it needs to +process a Texinfo file and the second command opens auxiliary files. + +Every Texinfo file must end with a line that terminates @TeX{}'s +processing and forces out unfinished pages: + +@example +@@bye +@end example + +Strictly speaking, these lines are all a Texinfo file needs to be +processed successfully by @TeX{}. + +Usually, however, the beginning includes an @code{@@settitle} command to +define the title of the printed manual, an @code{@@setchapternewpage} +command, a title page, a copyright page, and permissions. Besides an +@code{@@bye}, the end of a file usually includes indices and a table of +contents. (And of course most manuals contain a body of text as well.) + +@iftex +For more information, see +@ref{settitle, , @code{@@settitle}}, +@ref{setchapternewpage, , @code{@@setchapternewpage}}, +@ref{Headings, ,Page Headings}, +@ref{Titlepage & Copyright Page}, +@ref{Printing Indices & Menus}, and +@ref{Contents}. +@end iftex +@noindent +@ifinfo +For more information, see@* +@ref{settitle, , @code{@@settitle}},@* +@ref{setchapternewpage, , @code{@@setchapternewpage}},@* +@ref{Headings, ,Page Headings},@* +@ref{Titlepage & Copyright Page},@* +@ref{Printing Indices & Menus}, and@* +@ref{Contents}. +@end ifinfo + + +@node Preparing for TeX, Overfull hboxes, Requirements Summary, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Preparing to Use @TeX{} +@cindex Preparing to use @TeX{} +@cindex @TeX{} input initialization +@cindex @code{TEXINPUTS} environment variable +@vindex TEXINPUTS +@cindex @b{.profile} initialization file +@cindex @b{.cshrc} initialization file +@cindex Initialization file for @TeX{} input + +@TeX{} needs to know where to find the @file{texinfo.tex} file that you +have told it to input with the @samp{\input texinfo} command at the +beginning of the first line. The @file{texinfo.tex} file tells @TeX{} +how to handle @@-commands; it is included in all standard GNU +distributions. + +@pindex texinfo.tex@r{, installing} +Usually, the @file{texinfo.tex} file is put under the default directory +that contains @TeX{} macros +(@file{/usr/local/share/texmf/tex/texinfo/texinfo.tex} by default) when +GNU Emacs or other GNU software is installed. In this case, @TeX{} will +find the file and you do not need to do anything special. +Alternatively, you can put @file{texinfo.tex} in the current directory +when you run @TeX{}, and @TeX{} will find it there. + +@pindex epsf.tex@r{, installing} +Also, you should install @file{epsf.tex} in the same place as +@file{texinfo.tex}, if it is not already installed from another +distribution. This file is needed to support the @code{@@image} command +(@pxref{Images}). + +@pindex texinfo.cnf @r{installation} +@cindex Customizing of @TeX{} for Texinfo +@cindex Site-wide Texinfo configuration file +Optionally, you may create an additional @file{texinfo.cnf}, and install +it as well. This file is read by @TeX{} at the @code{@@setfilename} +command (@pxref{setfilename,, @code{@@setfilename}}). You can put any +commands you like there according to local site-wide conventions, and +they will be read by @TeX{} when processing any Texinfo document. For +example, if @file{texinfo.cnf} contains the a single line +@samp{@@afourpaper} (@pxref{A4 Paper}), then all Texinfo documents will +be processed with that page size in effect. If you have nothing to put +in @file{texinfo.cnf}, you do not need to create it. + +@vindex TEXINPUTS +If neither of the above locations for these system files suffice for +you, you can specify the directories explicitly. For +@file{texinfo.tex}, you can do this by writing the complete path for the +file after the @code{\input} command. Another way, that works for both +@file{texinfo.tex} and @file{texinfo.cnf} (and any other file @TeX{} +might read), is to set the @code{TEXINPUTS} environment variable in your +@file{.cshrc} or @file{.profile} file. + +Which you use of @file{.cshrc} or @file{.profile} depends on +whether you use a Bourne shell-compatible (@code{sh}, @code{bash}, +@code{ksh}, @dots{}) or C shell-compatible (@code{csh}, @code{tcsh}) +command interpreter. The latter read the @file{.cshrc} file for +initialization information, and the former read @file{.profile}. + +In a @file{.cshrc} file, you could use the following @code{csh} command +sequence: + +@example +setenv TEXINPUTS .:/home/me/mylib:/usr/lib/tex/macros +@end example + +@need 1000 +In a @file{.profile} file, you could use the following @code{sh} command +sequence: + +@example +@group +TEXINPUTS=.:/home/me/mylib:/usr/lib/tex/macros +export TEXINPUTS +@end group +@end example + +@noindent +This would cause @TeX{} to look for @file{\input} file first in the current +directory, indicated by the @samp{.}, then in a hypothetical user's +@file{me/mylib} directory, and finally in a system directory. + + +@node Overfull hboxes, smallbook, Preparing for TeX, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Overfull ``hboxes'' +@cindex Overfull @samp{hboxes} +@cindex @samp{hboxes}, overfull +@cindex Final output + +@TeX{} is sometimes unable to typeset a line without extending it into +the right margin. This can occur when @TeX{} comes upon what it +interprets as a long word that it cannot hyphenate, such as an +electronic mail network address or a very long title. When this +happens, @TeX{} prints an error message like this:@refill + +@example +Overfull \hbox (20.76302pt too wide) +@end example + +@noindent +(In @TeX{}, lines are in ``horizontal boxes'', hence the term, ``hbox''. +The backslash, @samp{\}, is the @TeX{} equivalent of @samp{@@}.)@refill + +@TeX{} also provides the line number in the Texinfo source file and +the text of the offending line, which is marked at all the places that +@TeX{} knows how to hyphenate words. +@xref{Debugging with TeX, , Catching Errors with @TeX{} Formatting}, +for more information about typesetting errors.@refill + +If the Texinfo file has an overfull hbox, you can rewrite the sentence +so the overfull hbox does not occur, or you can decide to leave it. A +small excursion into the right margin often does not matter and may not +even be noticeable.@refill + +@cindex Black rectangle in hardcopy +@cindex Rectangle, ugly, black in hardcopy +However, unless told otherwise, @TeX{} will print a large, ugly, black +rectangle beside the line that contains the overfull hbox. This is so +you will notice the location of the problem if you are correcting a +draft.@refill + +@need 1000 +@findex finalout +To prevent such a monstrosity from marring your final printout, write +the following in the beginning of the Texinfo file on a line of its own, +before the @code{@@titlepage} command:@refill + +@example +@@finalout +@end example + +@node smallbook, A4 Paper, Overfull hboxes, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Printing ``Small'' Books +@findex smallbook +@cindex Small book size +@cindex Book, printing small +@cindex Page sizes for books +@cindex Size of printed book + +By default, @TeX{} typesets pages for printing in an 8.5 by 11 inch +format. However, you can direct @TeX{} to typeset a document in a 7 by +9.25 inch format that is suitable for bound books by inserting the +following command on a line by itself at the beginning of the Texinfo +file, before the title page:@refill + +@example +@@smallbook +@end example + +@noindent +(Since regular sized books are often about 7 by 9.25 inches, this +command might better have been called the @code{@@regularbooksize} +command, but it came to be called the @code{@@smallbook} command by +comparison to the 8.5 by 11 inch format.)@refill + +If you write the @code{@@smallbook} command between the +start-of-header and end-of-header lines, the Texinfo mode @TeX{} +region formatting command, @code{texinfo-tex-region}, will format the +region in ``small'' book size (@pxref{Start of Header}).@refill + +The Free Software Foundation distributes printed copies of @cite{The GNU +Emacs Manual} and other manuals in the ``small'' book size. +@xref{smallexample & smalllisp, , @code{@@smallexample} and +@code{@@smalllisp}}, for information about commands that make it easier +to produce examples for a smaller manual.@refill + +Alternatively, to avoid embedding this physical paper size in your +document, use @code{texi2dvi} to format your document (@pxref{Format +with texi2dvi}), and supply @samp{-t @@smallbook} as an argument. Then +other people do not have to change the document source file to format it +differently. + + +@node A4 Paper, Cropmarks and Magnification, smallbook, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Printing on A4 Paper +@cindex A4 paper, printing on +@cindex Paper size, European A4 +@cindex European A4 paper +@findex afourpaper + +You can tell @TeX{} to typeset a document for printing on European size +A4 paper with the @code{@@afourpaper} command. Write the command on a +line by itself between @code{@@iftex} and @code{@@end iftex} lines near +the beginning of the Texinfo file, before the title page:@refill + +For example, this is how you would write the header for this manual:@refill + +@example +@group +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename texinfo +@@settitle Texinfo +@@syncodeindex vr fn +@@iftex +@@afourpaper +@@end iftex +@@c %**end of header +@end group +@end example + +Alternatively, to avoid embedding this physical paper size in your +document, use @code{texi2dvi} to format your document (@pxref{Format +with texi2dvi}), and supply @samp{-t @@afourpaper} as an argument. Then +other people do not have to change the document source file to format it +differently. + +@pindex texinfo.cnf +Another alternative: put the @code{@@afourpaper} command in the file +@file{texinfo.cnf} that @TeX{} will read. (No need for @code{@@iftex} +there.) This will automatically typeset all the Texinfo documents at +your site with that paper size in effect. + + +@node Cropmarks and Magnification, , A4 Paper, Format/Print Hardcopy +@comment node-name, next, previous, up +@section Cropmarks and Magnification + +@findex cropmarks +@cindex Cropmarks for printing +@cindex Printing cropmarks +You can attempt to direct @TeX{} to print cropmarks at the corners of +pages with the @code{@@cropmarks} command. Write the @code{@@cropmarks} +command on a line by itself between @code{@@iftex} and @code{@@end +iftex} lines near the beginning of the Texinfo file, before the title +page, like this:@refill + +@example +@group +@@iftex +@@cropmarks +@@end iftex +@end group +@end example + +This command is mainly for printers that typeset several pages on one +sheet of film; but you can attempt to use it to mark the corners of a +book set to 7 by 9.25 inches with the @code{@@smallbook} command. +(Printers will not produce cropmarks for regular sized output that is +printed on regular sized paper.) Since different printing machines work +in different ways, you should explore the use of this command with a +spirit of adventure. You may have to redefine the command in the +@file{texinfo.tex} definitions file.@refill + +@findex mag @r{(@TeX{} command)} +@cindex Magnified printing +@cindex Larger or smaller pages +You can attempt to direct @TeX{} to typeset pages larger or smaller than +usual with the @code{\mag} @TeX{} command. Everything that is typeset +is scaled proportionally larger or smaller. (@code{\mag} stands for +``magnification''.) This is @emph{not} a Texinfo @@-command, but is a +plain @TeX{} command that is prefixed with a backslash. You have to +write this command between @code{@@tex} and @code{@@end tex} +(@pxref{Raw Formatter Commands}). + +Follow the @code{\mag} command with an @samp{=} and then a number that +is 1000 times the magnification you desire. For example, to print pages +at 1.2 normal size, write the following near the beginning of the +Texinfo file, before the title page:@refill + +@example +@group +@@tex +\mag=1200 +@@end tex +@end group +@end example + +With some printing technologies, you can print normal-sized copies that +look better than usual by using a larger-than-normal master.@refill + +Depending on your system, @code{\mag} may not work or may work only at +certain magnifications. Be prepared to experiment.@refill + +@node Create an Info File, Install an Info File, Format/Print Hardcopy, Top +@comment node-name, next, previous, up +@chapter Creating an Info File +@cindex Creating an Info file +@cindex Info, creating an on-line file +@cindex Formatting a file for Info + +@code{makeinfo} is a utility that converts a Texinfo file into an Info +file; @code{texinfo-format-region} and @code{texinfo-format-buffer} are +GNU Emacs functions that do the same.@refill + +A Texinfo file must contain an @code{@@setfilename} line near its +beginning, otherwise the Info formatting commands will fail. + +For information on installing the Info file in the Info system, see +@ref{Install an Info File}.@refill + +@menu +* makeinfo advantages:: @code{makeinfo} provides better error checking. +* Invoking makeinfo:: How to run @code{makeinfo} from a shell. +* makeinfo options:: Specify fill-column and other options. +* Pointer Validation:: How to check that pointers point somewhere. +* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs. +* texinfo-format commands:: Two Info formatting commands written + in Emacs Lisp are an alternative + to @code{makeinfo}. +* Batch Formatting:: How to format for Info in Emacs Batch mode. +* Tag and Split Files:: How tagged and split files help Info + to run better. +@end menu + +@node makeinfo advantages, Invoking makeinfo, Create an Info File, Create an Info File +@ifinfo +@heading @code{makeinfo} Preferred +@end ifinfo + +The @code{makeinfo} utility creates an Info file from a Texinfo source +file more quickly than either of the Emacs formatting commands and +provides better error messages. We recommend it. @code{makeinfo} is a +C program that is independent of Emacs. You do not need to run Emacs to +use @code{makeinfo}, which means you can use @code{makeinfo} on machines +that are too small to run Emacs. You can run @code{makeinfo} in +any one of three ways: from an operating system shell, from a shell +inside Emacs, or by typing a key command in Texinfo mode in Emacs. +@refill + +The @code{texinfo-format-region} and the @code{texinfo-format-buffer} +commands are useful if you cannot run @code{makeinfo}. Also, in some +circumstances, they format short regions or buffers more quickly than +@code{makeinfo}.@refill + +@node Invoking makeinfo, makeinfo options, makeinfo advantages, Create an Info File +@section Running @code{makeinfo} from a Shell + +To create an Info file from a Texinfo file, type @code{makeinfo} +followed by the name of the Texinfo file. Thus, to create the Info +file for Bison, type the following to the shell: +is the prompt):@refill + +@example +makeinfo bison.texinfo +@end example + +(You can run a shell inside Emacs by typing @kbd{M-x shell}.)@refill + +@ifinfo +Sometimes you will want to specify options. For example, if you wish +to discover which version of @code{makeinfo} you are using, +type:@refill + +@example +makeinfo --version +@end example + +@xref{makeinfo options}, for more information. +@end ifinfo + + +@node makeinfo options, Pointer Validation, Invoking makeinfo, Create an Info File +@comment node-name, next, previous, up +@section Options for @code{makeinfo} +@cindex @code{makeinfo} options +@cindex Options for @code{makeinfo} + +The @code{makeinfo} command takes a number of options. Most often, +options are used to set the value of the fill column and specify the +footnote style. Each command line option is a word preceded by +@samp{--} or a letter preceded by @samp{-}. You can use abbreviations +for the long option names as long as they are unique.@refill + +For example, you could use the following shell command to create an Info +file for @file{bison.texinfo} in which each line is filled to only 68 +columns:@refill + +@example +makeinfo --fill-column=68 bison.texinfo +@end example + +You can write two or more options in sequence, like this:@refill + +@example +makeinfo --no-split --fill-column=70 @dots{} +@end example + +@noindent +This would keep the Info file together as one possibly very long +file and would also set the fill column to 70.@refill + +The options are: + +@table @code + +@item -D @var{var} +@opindex -D @var{var} +Cause the variable @var{var} to be defined. This is equivalent to +@code{@@set @var{var}} in the Texinfo file (@pxref{set clear value}). + +@item --error-limit=@var{limit} +@opindex --error-limit=@var{limit} +Set the maximum number of errors that @code{makeinfo} will report +before exiting (on the assumption that continuing would be useless); +default 100. + +@need 150 +@item --fill-column=@var{width} +@opindex --fill-column=@var{width} +Specify the maximum number of columns in a line; this is the right-hand +edge of a line. Paragraphs that are filled will be filled to this +width. (Filling is the process of breaking up and connecting lines so +that lines are the same length as or shorter than the number specified +as the fill column. Lines are broken between words.) The default value +is 72. + +@item --footnote-style=@var{style} +@opindex --footnote-style=@var{style} +Set the footnote style to @var{style}, either @samp{end} for the end +node style (the default) or @samp{separate} for the separate node style. +The value set by this option overrides the value set in a Texinfo file +by an @code{@@footnotestyle} command (@pxref{Footnotes}). When the +footnote style is @samp{separate}, @code{makeinfo} makes a new node +containing the footnotes found in the current node. When the footnote +style is @samp{end}, @code{makeinfo} places the footnote references at +the end of the current node. + +@item --force +@opindex --force +Ordinarily, if the input file has errors, the output files are not +created. With this option, they are preserved. + +@item --help +@opindex --help +Print a usage message listing all available options, then exit successfully. + +@item -I @var{dir} +@opindex -I @var{dir} +Add @code{dir} to the directory search list for finding files that are +included using the @code{@@include} command. By default, +@code{makeinfo} searches only the current directory. + +@item --no-headers +@opindex --no-headers +Do not include menus or node lines in the output. This results in an +@sc{ascii} file that you cannot read in Info since it does not contain +the requisite nodes or menus. It is primarily useful to extract certain +pieces of a manual into separate files to be included in a distribution, +such as @file{INSTALL} files. + +@item --no-split +@opindex --no-split +Suppress the splitting stage of @code{makeinfo}. By default, large +output files (where the size is greater than 70k bytes) are split into +smaller subfiles, each one approximately 50k bytes. + +@item --no-pointer-validate +@itemx --no-validate +@opindex --no-pointer-validate +@opindex --no-validate +Suppress the pointer-validation phase of @code{makeinfo}. Normally, +after a Texinfo file is processed, some consistency checks are made to +ensure that cross references can be resolved, etc. +@xref{Pointer Validation}.@refill + +@item --no-warn +@opindex --no-warn +Suppress warning messages (but @emph{not} error messages). You might +want this if the file you are creating has examples of Texinfo cross +references within it, and the nodes that are referenced do not actually +exist. + +@item --no-number-footnotes +@opindex --no-number-footnotes +Suppress automatic footnote numbering. By default, @code{makeinfo} +numbers each footnote sequentially in a single node, resetting the +current footnote number to 1 at the start of each node. + +@item --output=@var{file} +@itemx -o @var{file} +@opindex --output=@var{file} +@opindex -o @var{file} +Specify that the output should be directed to @var{file} and not to the +file name specified in the @code{@@setfilename} command found in the +Texinfo source (@pxref{setfilename}). If @var{file} is @samp{-}, output +goes to standard output and @samp{--no-split} is implied. + +@item -P @var{dir} +@opindex -P @var{dir} +Prepend @code{dir} to the directory search list for @code{@@include}. +See @samp{-I} for more details. + +@item --paragraph-indent=@var{indent} +@opindex --paragraph-indent=@var{indent} +Set the paragraph indentation style to @var{indent}. The value set by +this option overrides the value set in a Texinfo file by an +@code{@@paragraphindent} command (@pxref{paragraphindent}). The value +of @var{indent} is interpreted as follows: + +@table @asis +@item @samp{asis} +Preserve any existing indentation at the starts of paragraphs. + +@item @samp{0} or @samp{none} +Delete any existing indentation. + +@item @var{num} +Indent each paragraph by that number of spaces. +@end table + +@item --reference-limit=@var{limit} +@opindex --reference-limit=@var{limit} +Set the value of the number of references to a node that +@code{makeinfo} will make without reporting a warning. If a node has more +than this number of references in it, @code{makeinfo} will make the +references but also report a warning. The default is 1000. + +@item -U @var{var} +Cause @var{var} to be undefined. This is equivalent to +@code{@@clear @var{var}} in the Texinfo file (@pxref{set clear value}). + +@item --verbose +@opindex --verbose +Cause @code{makeinfo} to display messages saying what it is doing. +Normally, @code{makeinfo} only outputs messages if there are errors or +warnings. + +@item --version +@opindex --version +Print the version number, then exit successfully. + +@end table + + +@node Pointer Validation, makeinfo in Emacs, makeinfo options, Create an Info File +@section Pointer Validation +@cindex Pointer validation with @code{makeinfo} +@cindex Validation of pointers + +If you do not suppress pointer-validation, @code{makeinfo} will check +the validity of the final Info file. Mostly, this means ensuring that +nodes you have referenced really exist. Here is a complete list of what +is checked:@refill + +@enumerate +@item +If a `Next', `Previous', or `Up' node reference is a reference to a +node in the current file and is not an external reference such as to +@file{(dir)}, then the referenced node must exist.@refill + +@item +In every node, if the `Previous' node is different from the `Up' node, +then the `Previous' node must also be pointed to by a `Next' node.@refill + +@item +Every node except the `Top' node must have an `Up' pointer.@refill + +@item +The node referenced by an `Up' pointer must contain a reference to the +current node in some manner other than through a `Next' reference. +This includes menu entries and cross references.@refill + +@item +If the `Next' reference of a node is not the same as the `Next' reference +of the `Up' reference, then the node referenced by the `Next' pointer +must have a `Previous' pointer that points back to the current node. +This rule allows the last node in a section to point to the first node +of the next chapter.@refill +@end enumerate + +@node makeinfo in Emacs, texinfo-format commands, Pointer Validation, Create an Info File +@section Running @code{makeinfo} inside Emacs +@cindex Running @code{makeinfo} in Emacs +@cindex @code{makeinfo} inside Emacs +@cindex Shell, running @code{makeinfo} in + +You can run @code{makeinfo} in GNU Emacs Texinfo mode by using either the +@code{makeinfo-region} or the @code{makeinfo-buffer} commands. In +Texinfo mode, the commands are bound to @kbd{C-c C-m C-r} and @kbd{C-c +C-m C-b} by default.@refill + +@table @kbd +@item C-c C-m C-r +@itemx M-x makeinfo-region +Format the current region for Info.@refill +@findex makeinfo-region + +@item C-c C-m C-b +@itemx M-x makeinfo-buffer +Format the current buffer for Info.@refill +@findex makeinfo-buffer +@end table + +When you invoke either @code{makeinfo-region} or +@code{makeinfo-buffer}, Emacs prompts for a file name, offering the +name of the visited file as the default. You can edit the default +file name in the minibuffer if you wish, before pressing @key{RET} to +start the @code{makeinfo} process.@refill + +The Emacs @code{makeinfo-region} and @code{makeinfo-buffer} commands +run the @code{makeinfo} program in a temporary shell buffer. If +@code{makeinfo} finds any errors, Emacs displays the error messages in +the temporary buffer.@refill + +@cindex Errors, parsing +@cindex Parsing errors +@findex next-error +You can parse the error messages by typing @kbd{C-x `} +(@code{next-error}). This causes Emacs to go to and position the +cursor on the line in the Texinfo source that @code{makeinfo} thinks +caused the error. @xref{Compilation, , Running @code{make} or +Compilers Generally, emacs, The GNU Emacs Manual}, for more +information about using the @code{next-error} command.@refill + +In addition, you can kill the shell in which the @code{makeinfo} +command is running or make the shell buffer display its most recent +output.@refill + +@table @kbd +@item C-c C-m C-k +@itemx M-x makeinfo-kill-job +@findex makeinfo-kill-job +Kill the current running @code{makeinfo} job created by +@code{makeinfo-region} or @code{makeinfo-buffer}.@refill + +@item C-c C-m C-l +@itemx M-x makeinfo-recenter-output-buffer +@findex makeinfo-recenter-output-buffer +Redisplay the @code{makeinfo} shell buffer to display its most recent +output.@refill +@end table + +@noindent +(Note that the parallel commands for killing and recentering a @TeX{} +job are @kbd{C-c C-t C-k} and @kbd{C-c C-t C-l}. @xref{Texinfo Mode +Printing}.)@refill + +You can specify options for @code{makeinfo} by setting the +@code{makeinfo-options} variable with either the @kbd{M-x +edit-options} or the @kbd{M-x set-variable} command, or by setting the +variable in your @file{.emacs} initialization file.@refill + +For example, you could write the following in your @file{.emacs} file:@refill + +@example +@group +(setq makeinfo-options + "--paragraph-indent=0 --no-split + --fill-column=70 --verbose") +@end group +@end example + +@c If you write these three cross references using xref, you see +@c three references to the same named manual, which looks strange. +@iftex +For more information, see @ref{makeinfo options, , Options for +@code{makeinfo}}, as well as ``Editing Variable Values,''``Examining and +Setting Variables,'' and ``Init File'' in the @cite{The GNU Emacs +Manual}. +@end iftex +@noindent +@ifinfo +For more information, see@* +@ref{Edit Options, , Editing Variable Values, emacs, The GNU Emacs Manual},@* +@ref{Examining, , Examining and Setting Variables, emacs, The GNU Emacs Manual},@* +@ref{Init File, , , emacs, The GNU Emacs Manual}, and@* +@ref{makeinfo options, , Options for @code{makeinfo}}. +@end ifinfo + +@node texinfo-format commands, Batch Formatting, makeinfo in Emacs, Create an Info File +@comment node-name, next, previous, up +@section The @code{texinfo-format@dots{}} Commands +@findex texinfo-format-region +@findex texinfo-format-buffer + +In GNU Emacs in Texinfo mode, you can format part or all of a Texinfo +file with the @code{texinfo-format-region} command. This formats the +current region and displays the formatted text in a temporary buffer +called @samp{*Info Region*}.@refill + +Similarly, you can format a buffer with the +@code{texinfo-format-buffer} command. This command creates a new +buffer and generates the Info file in it. Typing @kbd{C-x C-s} will +save the Info file under the name specified by the +@code{@@setfilename} line which must be near the beginning of the +Texinfo file.@refill + +@table @kbd +@item C-c C-e C-r +@itemx @code{texinfo-format-region} +Format the current region for Info. +@findex texinfo-format-region + +@item C-c C-e C-b +@itemx @code{texinfo-format-buffer} +Format the current buffer for Info. +@findex texinfo-format-buffer +@end table + +The @code{texinfo-format-region} and @code{texinfo-format-buffer} +commands provide you with some error checking, and other functions can +provide you with further help in finding formatting errors. These +procedures are described in an appendix; see @ref{Catching Mistakes}. +However, the @code{makeinfo} program is often faster and +provides better error checking (@pxref{makeinfo in Emacs}).@refill + +@node Batch Formatting, Tag and Split Files, texinfo-format commands, Create an Info File +@comment node-name, next, previous, up +@section Batch Formatting +@cindex Batch formatting for Info +@cindex Info batch formatting + +You can format Texinfo files for Info using @code{batch-texinfo-format} +and Emacs Batch mode. You can run Emacs in Batch mode from any shell, +including a shell inside of Emacs. (@xref{Command Switches, , Command +Line Switches and Arguments, emacs, The GNU Emacs Manual}.)@refill + +Here is a shell command to format all the files that end in +@file{.texinfo} in the current directory: + +@example +emacs -batch -funcall batch-texinfo-format *.texinfo +@end example + +@noindent +Emacs processes all the files listed on the command line, even if an +error occurs while attempting to format some of them.@refill + +Run @code{batch-texinfo-format} only with Emacs in Batch mode as shown; +it is not interactive. It kills the Batch mode Emacs on completion.@refill + +@code{batch-texinfo-format} is convenient if you lack @code{makeinfo} +and want to format several Texinfo files at once. When you use Batch +mode, you create a new Emacs process. This frees your current Emacs, so +you can continue working in it. (When you run +@code{texinfo-format-region} or @code{texinfo-format-buffer}, you cannot +use that Emacs for anything else until the command finishes.)@refill + +@node Tag and Split Files, , Batch Formatting, Create an Info File +@comment node-name, next, previous, up +@section Tag Files and Split Files +@cindex Making a tag table automatically +@cindex Tag table, making automatically + +If a Texinfo file has more than 30,000 bytes, +@code{texinfo-format-buffer} automatically creates a tag table +for its Info file; @code{makeinfo} always creates a tag table. With +a @dfn{tag table}, Info can jump to new nodes more quickly than it can +otherwise.@refill + +@cindex Indirect subfiles +In addition, if the Texinfo file contains more than about 70,000 +bytes, @code{texinfo-format-buffer} and @code{makeinfo} split the +large Info file into shorter @dfn{indirect} subfiles of about 50,000 +bytes each. Big files are split into smaller files so that Emacs does +not need to make a large buffer to hold the whole of a large Info +file; instead, Emacs allocates just enough memory for the small, split +off file that is needed at the time. This way, Emacs avoids wasting +memory when you run Info. (Before splitting was implemented, Info +files were always kept short and @dfn{include files} were designed as +a way to create a single, large printed manual out of the smaller Info +files. @xref{Include Files}, for more information. Include files are +still used for very large documents, such as @cite{The Emacs Lisp +Reference Manual}, in which each chapter is a separate file.)@refill + +When a file is split, Info itself makes use of a shortened version of +the original file that contains just the tag table and references to +the files that were split off. The split off files are called +@dfn{indirect} files.@refill + +The split off files have names that are created by appending @w{@samp{-1}}, +@w{@samp{-2}}, @w{@samp{-3}} and so on to the file name specified by the +@code{@@setfilename} command. The shortened version of the original file +continues to have the name specified by @code{@@setfilename}.@refill + +At one stage in writing this document, for example, the Info file was saved +as @file{test-texinfo} and that file looked like this:@refill + +@example +@group +Info file: test-texinfo, -*-Text-*- +produced by texinfo-format-buffer +from file: new-texinfo-manual.texinfo + +^_ +Indirect: +test-texinfo-1: 102 +test-texinfo-2: 50422 +@end group +@group +test-texinfo-3: 101300 +^_^L +Tag table: +(Indirect) +Node: overview^?104 +Node: info file^?1271 +@end group +@group +Node: printed manual^?4853 +Node: conventions^?6855 +@dots{} +@end group +@end example + +@noindent +(But @file{test-texinfo} had far more nodes than are shown here.) Each of +the split off, indirect files, @file{test-texinfo-1}, +@file{test-texinfo-2}, and @file{test-texinfo-3}, is listed in this file +after the line that says @samp{Indirect:}. The tag table is listed after +the line that says @samp{Tag table:}. @refill + +In the list of indirect files, the number following the file name +records the cumulative number of bytes in the preceding indirect files, +not counting the file list itself, the tag table, or the permissions +text in each file. In the tag table, the number following the node name +records the location of the beginning of the node, in bytes from the +beginning.@refill + +If you are using @code{texinfo-format-buffer} to create Info files, +you may want to run the @code{Info-validate} command. (The +@code{makeinfo} command does such a good job on its own, you do not +need @code{Info-validate}.) However, you cannot run the @kbd{M-x +Info-validate} node-checking command on indirect files. For +information on how to prevent files from being split and how to +validate the structure of the nodes, see @ref{Using +Info-validate}.@refill + + +@node Install an Info File, Command List, Create an Info File, Top +@comment node-name, next, previous, up +@chapter Installing an Info File +@cindex Installing an Info file +@cindex Info file installation +@cindex @file{dir} directory for Info installation + +Info files are usually kept in the @file{info} directory. You can read +Info files using the standalone Info program or the Info reader built +into Emacs. (@inforef{Top, info, info}, for an introduction to Info.) + +@menu +* Directory file:: The top level menu for all Info files. +* New Info File:: Listing a new info file. +* Other Info Directories:: How to specify Info files that are + located in other directories. +* Installing Dir Entries:: How to specify what menu entry to add + to the Info directory. +* Invoking install-info:: @code{install-info} options. +@end menu + +@node Directory file, New Info File, Install an Info File, Install an Info File +@ifinfo +@heading The @file{dir} File +@end ifinfo + +For Info to work, the @file{info} directory must contain a file that +serves as a top level directory for the Info system. By convention, +this file is called @file{dir}. (You can find the location of this file +within Emacs by typing @kbd{C-h i} to enter Info and then typing +@kbd{C-x C-f} to see the pathname to the @file{info} directory.) + +The @file{dir} file is itself an Info file. It contains the top level +menu for all the Info files in the system. The menu looks like +this:@refill + +@example +@group +* Menu: + +* Info: (info). Documentation browsing system. +* Emacs: (emacs). The extensible, self-documenting + text editor. +* Texinfo: (texinfo). With one source file, make + either a printed manual using + TeX or an Info file. +@dots{} +@end group +@end example + +Each of these menu entries points to the `Top' node of the Info file +that is named in parentheses. (The menu entry does not need to +specify the `Top' node, since Info goes to the `Top' node if no node +name is mentioned. @xref{Other Info Files, , Nodes in Other Info +Files}.)@refill + +Thus, the @samp{Info} entry points to the `Top' node of the +@file{info} file and the @samp{Emacs} entry points to the `Top' node +of the @file{emacs} file.@refill + +In each of the Info files, the `Up' pointer of the `Top' node refers +back to the @code{dir} file. For example, the line for the `Top' +node of the Emacs manual looks like this in Info:@refill + +@example +File: emacs Node: Top, Up: (DIR), Next: Distrib +@end example + +@noindent +(Note that in this case, the @file{dir} file name is written in upper +case letters---it can be written in either upper or lower case. Info +has a feature that it will change the case of the file name to lower +case if it cannot find the name as written.)@refill +@c !!! Can any file name be written in upper or lower case, +@c or is dir a special case? +@c Yes, apparently so, at least with Gillespie's Info. --rjc 24mar92 + + +@node New Info File, Other Info Directories, Directory file, Install an Info File +@section Listing a New Info File +@cindex Adding a new info file +@cindex Listing a new info file +@cindex New info file, listing it in @file{dir} file +@cindex Info file, listing new one +@cindex @file{dir} file listing + +To add a new Info file to your system, you must write a menu entry to +add to the menu in the @file{dir} file in the @file{info} directory. +For example, if you were adding documentation for GDB, you would write +the following new entry:@refill + +@example +* GDB: (gdb). The source-level C debugger. +@end example + +@noindent +The first part of the menu entry is the menu entry name, followed by a +colon. The second part is the name of the Info file, in parentheses, +followed by a period. The third part is the description. + +The name of an Info file often has a @file{.info} extension. Thus, the +Info file for GDB might be called either @file{gdb} or @file{gdb.info}. +The Info reader programs automatically try the file name both with and +without @file{.info}; so it is better to avoid clutter and not to write +@samp{.info} explicitly in the menu entry. For example, the GDB menu +entry should use just @samp{gdb} for the file name, not @samp{gdb.info}. + + +@node Other Info Directories, Installing Dir Entries, New Info File, Install an Info File +@comment node-name, next, previous, up +@section Info Files in Other Directories +@cindex Installing Info in another directory +@cindex Info installed in another directory +@cindex Another Info directory + +If an Info file is not in the @file{info} directory, there are three +ways to specify its location:@refill + +@itemize @bullet +@item +Write the pathname in the @file{dir} file as the second part of the +menu.@refill + +@item +If you are using Emacs, list the name of the file in a second @file{dir} +file, in its directory; and then add the name of that directory to the +@code{Info-directory-list} variable in your personal or site +initialization file. + +This tells Emacs where to look for @file{dir} files. Emacs merges the +files named @file{dir} from each of the listed directories. (In Emacs +version 18, you can set the @code{Info-directory} variable to the name +of only one directory.)@refill + +@item +Specify the Info directory name in the @code{INFOPATH} environment +variable in your @file{.profile} or @file{.cshrc} initialization file. +(Only you and others who set this environment variable will be able to +find Info files whose location is specified this way.)@refill +@end itemize + +For example, to reach a test file in the @file{/home/bob/manuals} +directory, you could add an entry like this to the menu in the +@file{dir} file:@refill + +@example +* Test: (/home/bob/manuals/info-test). Bob's own test file. +@end example + +@noindent +In this case, the absolute file name of the @file{info-test} file is +written as the second part of the menu entry.@refill + +@vindex Info-directory-list +Alternatively, you could write the following in your @file{.emacs} +file:@refill + +@example +@group +(setq Info-directory-list + '("/home/bob/manuals" + "/usr/local/info")) +@end group +@end example + +@c reworded to avoid overfill hbox +This tells Emacs to merge the @file{dir} file from the +@file{/home/bob/manuals} directory with the @file{dir} file from the +@file{/usr/local/info} directory. Info will list the +@file{/home/bob/manuals/info-test} file as a menu entry in the +@file{/home/bob/manuals/dir} file.@refill + +@vindex INFOPATH +Finally, you can tell Info where to look by setting the @code{INFOPATH} +environment variable in your @file{.cshrc} or @file{.profile} file. If +you use a Bourne-compatible shell such as @code{sh} or @code{bash} for +your shell command interpreter, you set the @code{INFOPATH} environment +variable in the @file{.profile} initialization file; but if you use +@code{csh} or @code{tcsh}, you must set the variable in the +@file{.cshrc} initialization file. The two types of shells use +different syntax. + +@itemize @bullet +@item +In a @file{.cshrc} file, you could set the @code{INFOPATH} +variable as follows:@refill + +@smallexample +setenv INFOPATH .:~/manuals:/usr/local/emacs/info +@end smallexample + +@item +In a @file{.profile} file, you would achieve the same effect by +writing:@refill + +@smallexample +INFOPATH=.:$HOME/manuals:/usr/local/emacs/info +export INFOPATH +@end smallexample +@end itemize + +@noindent +The @samp{.} indicates the current directory as usual. Emacs uses the +@code{INFOPATH} environment variable to initialize the value of Emacs's +own @code{Info-directory-list} variable. + +@cindex @samp{:} @r{last in @code{INFOPATH}} +However you set @code{INFOPATH}, if its last character is a colon, this +is replaced by the default (compiled-in) path. This gives you a way to +augment the default path with new directories without having to list all +the standard places. For example (using @code{sh} syntax: + +@example +INFOPATH=/local/info: +export INFOPATH +@end example + +@noindent +will search @file{/local/info} first, then the standard directories. +Leading or doubled colons are not treated specially. + + +@node Installing Dir Entries, Invoking install-info, Other Info Directories, Install an Info File +@section Installing Info Directory Files + +When you install an Info file onto your system, you can use the program +@code{install-info} to update the Info directory file @file{dir}. +Normally the makefile for the package runs @code{install-info}, just +after copying the Info file into its proper installed location. + +@findex dircategory +@findex direntry +In order for the Info file to work with @code{install-info}, you should +use the commands @code{@@dircategory} and @code{@@direntry} in the +Texinfo source file. Use @code{@@direntry} to specify the menu entry to +add to the Info directory file, and use @code{@@dircategory} to specify +which part of the Info directory to put it in. Here is how these +commands are used in this manual: + +@smallexample +@@dircategory Texinfo documentation system +@@direntry +* Texinfo: (texinfo). The GNU documentation format. +* install-info: (texinfo)Invoking install-info. @dots{} +@dots{} +@@end direntry +@end smallexample + +Here's what this produces in the Info file: + +@smallexample +INFO-DIR-SECTION Texinfo documentation system +START-INFO-DIR-ENTRY +* Texinfo: (texinfo). The GNU documentation format. +* install-info: (texinfo)Invoking install-info. @dots{} +@dots{} +END-INFO-DIR-ENTRY +@end smallexample + +@noindent +The @code{install-info} program sees these lines in the Info file, and +that is how it knows what to do. + +Always use the @code{@@direntry} and @code{@@dircategory} commands near +the beginning of the Texinfo input, before the first @code{@@node} +command. If you use them later on in the input, @code{install-info} +will not notice them. + +If you use @code{@@dircategory} more than once in the Texinfo source, +each usage specifies one category; the new menu entry is added to the +Info directory file in each of the categories you specify. If you use +@code{@@direntry} more than once, each usage specifies one menu entry; +each of these menu entries is added to the directory in each of the +specified categories. + + +@node Invoking install-info, , Installing Dir Entries, Install an Info File +@section Invoking install-info + +@pindex install-info + +@code{install-info} inserts menu entries from an Info file into the +top-level @file{dir} file in the Info system (see the previous sections +for an explanation of how the @file{dir} file works). It's most often +run as part of software installation, or when constructing a dir file +for all manuals on a system. Synopsis: + +@example +install-info [@var{option}]@dots{} [@var{info-file} [@var{dir-file}]] +@end example + +If @var{info-file} or @var{dir-file} are not specified, the various +options (described below) that define them must be. There are no +compile-time defaults, and standard input is never used. +@code{install-info} can read only one info file and write only one dir +file per invocation. + +@cindex @file{dir}, created by @code{install-info} +If @var{dir-file} (however specified) does not exist, +@code{install-info} creates it if possible (with no entries). + +Options: + +@table @code +@item --delete +@opindex --delete +Delete the entries in @var{info-file} from @var{dir-file}. The file +name in the entry in @var{dir-file} must be @var{info-file} (except for +an optional @samp{.info} in either one). Don't insert any new entries. + +@item --dir-file=@var{name} +@opindex --dir-file=@var{name} +Specify file name of the Info directory file. This is equivalent to +using the @var{dir-file} argument. + +@item --entry=@var{text} +@opindex --entry=@var{text} +Insert @var{text} as an Info directory entry; @var{text} should have the +form of an Info menu item line plus zero or more extra lines starting +with whitespace. If you specify more than one entry, they are all +added. If you don't specify any entries, they are determined from +information in the Info file itself. + +@item --help +@opindex --help +Display a usage message listing basic usage and all available options, +then exit successfully. + +@item --info-file=@var{file} +@opindex --info-file=@var{file} +Specify Info file to install in the directory. +This is equivalent to using the @var{info-file} argument. + +@item --info-dir=@var{dir} +@opindex --info-dir=@var{dir} +Equivalent to @samp{--dir-file=@var{dir}/dir}. + +@item --item=@var{text} +@opindex --item=@var{text} +Same as @samp{--entry=@var{text}}. An Info directory entry is actually +a menu item. + +@item --quiet +@opindex --quiet +Suppress warnings. + +@item --remove +@opindex --remove +Same as @samp{--delete}. + +@item --section=@var{sec} +@opindex --section=@var{sec} +Put this file's entries in section @var{sec} of the directory. If you +specify more than one section, all the entries are added in each of the +sections. If you don't specify any sections, they are determined from +information in the Info file itself. + +@item --version +@opindex --version +@cindex version number, finding +Display version information and exit successfully. + +@end table + + +@node Command List, Tips, Install an Info File, Top +@appendix @@-Command List +@cindex Alphabetical @@-command list +@cindex List of @@-commands +@cindex @@-command list + +Here is an alphabetical list of the @@-commands in Texinfo. Square +brackets, @t{[}@w{ }@t{]}, indicate optional arguments; an ellipsis, +@samp{@dots{}}, indicates repeated text.@refill + +@sp 1 +@table @code +@item @@@var{whitespace} +An @code{@@} followed by a space, tab, or newline produces a normal, +stretchable, interword space. @xref{Multiple Spaces}. + +@item @@! +Generate an exclamation point that really does end a sentence (usually +after an end-of-sentence capital letter). @xref{Ending a Sentence}. + +@item @@" +@itemx @@' +Generate an umlaut or acute accent, respectively, over the next +character, as in @"o and @'o. @xref{Inserting Accents}. + +@item @@* +Force a line break. Do not end a paragraph that uses @code{@@*} with +an @code{@@refill} command. @xref{Line Breaks}.@refill + +@item @@,@{@var{c}@} +Generate a cedilla accent under @var{c}, as in @,{c}. @xref{Inserting +Accents}. + +@item @@- +Insert a discretionary hyphenation point. @xref{- and hyphenation}. + +@item @@. +Produce a period that really does end a sentence (usually after an +end-of-sentence capital letter). @xref{Ending a Sentence}. + +@item @@: +Indicate to @TeX{} that an immediately preceding period, question +mark, exclamation mark, or colon does not end a sentence. Prevent +@TeX{} from inserting extra whitespace as it does at the end of a +sentence. The command has no effect on the Info file output. +@xref{Not Ending a Sentence}.@refill + +@item @@= +Generate a macro (bar) accent over the next character, as in @=o. +@xref{Inserting Accents}. + +@item @@? +Generate a question mark that really does end a sentence (usually after +an end-of-sentence capital letter). @xref{Ending a Sentence}. + +@item @@@@ +Stands for an at sign, @samp{@@}. +@xref{Braces Atsigns, , Inserting @@ and braces}. + +@item @@^ +@itemx @@` +Generate a circumflex (hat) or grave accent, respectively, over the next +character, as in @^o. +@xref{Inserting Accents}. + +@item @@@{ +Stands for a left brace, @samp{@{}. +@xref{Braces Atsigns, , Inserting @@ and braces}. + +@item @@@} +Stands for a right-hand brace, @samp{@}}.@* +@xref{Braces Atsigns, , Inserting @@ and braces}. + +@item @@= +Generate a tilde accent over the next character, as in @~N. +@xref{Inserting Accents}. + +@item @@AA@{@} +@itemx @@aa@{@} +Generate the uppercase and lowercase Scandinavian A-ring letters, +respectively: @AA{}, @aa{}. @xref{Inserting Accents}. + +@item @@AE@{@} +@itemx @@ae@{@} +Generate the uppercase and lowercase AE ligatures, respectively: +@AE{}, @ae{}. @xref{Inserting Accents}. + +@item @@afourpaper +Change page dimensions for the A4 paper size. +Only allowed inside @code{@@iftex} @dots{} @code{@@end iftex}. +@xref{A4 Paper}. + +@item @@appendix @var{title} +Begin an appendix. The title appears in the table +of contents of a printed manual. In Info, the title is +underlined with asterisks. @xref{unnumbered & appendix, , The +@code{@@unnumbered} and @code{@@appendix} Commands}.@refill + +@item @@appendixsec @var{title} +@itemx @@appendixsection @var{title} +Begin an appendix section within an appendix. The section title appears +in the table of contents of a printed manual. In Info, the title is +underlined with equal signs. @code{@@appendixsection} is a longer +spelling of the @code{@@appendixsec} command. @xref{unnumberedsec +appendixsec heading, , Section Commands}.@refill + +@item @@appendixsubsec @var{title} +Begin an appendix subsection within an appendix. The title appears +in the table of contents of a printed manual. In Info, the title is +underlined with hyphens. @xref{unnumberedsubsec appendixsubsec +subheading, , Subsection Commands}.@refill + +@item @@appendixsubsubsec @var{title} +Begin an appendix subsubsection within an appendix subsection. The +title appears in the table of contents of a printed manual. In Info, +the title is underlined with periods. @xref{subsubsection,, The +`subsub' Commands}.@refill + +@item @@asis +Used following @code{@@table}, @code{@@ftable}, and @code{@@vtable} to +print the table's first column without highlighting (``as is''). +@xref{Two-column Tables, , Making a Two-column Table}.@refill + +@item @@author @var{author} +Typeset @var{author} flushleft and underline it. @xref{title +subtitle author, , The @code{@@title} and @code{@@author} +Commands}.@refill + +@item @@b@{@var{text}@} +Print @var{text} in @b{bold} font. No effect in Info. @xref{Fonts}.@refill + +@ignore +@item @@br +Force a paragraph break. If used within a line, follow @code{@@br} +with braces. @xref{br, , @code{@@br}}.@refill +@end ignore + +@item @@bullet@{@} +Generate a large round dot, or the closest possible +thing to one. @xref{bullet, , @code{@@bullet}}.@refill + +@item @@bye +Stop formatting a file. The formatters do not see the contents of a +file following an @code{@@bye} command. @xref{Ending a File}.@refill + +@item @@c @var{comment} +Begin a comment in Texinfo. The rest of the line does not appear in +either the Info file or the printed manual. A synonym for +@code{@@comment}. @xref{Comments, , Comments}.@refill + +@item @@cartouche +Highlight an example or quotation by drawing a box with rounded +corners around it. Pair with @code{@@end cartouche}. No effect in +Info. @xref{cartouche, , Drawing Cartouches Around Examples}.)@refill + +@item @@center @var{line-of-text} +Center the line of text following the command. +@xref{titlefont center sp, , @code{@@center}}.@refill + +@item @@centerchap @var{line-of-text} +Like @code{@@chapter}, but centers the chapter title. @xref{chapter,, +@code{@@chapter}}. + +@item @@chapheading @var{title} +Print a chapter-like heading in the text, but not in the table of +contents of a printed manual. In Info, the title is underlined with +asterisks. @xref{majorheading & chapheading, , @code{@@majorheading} +and @code{@@chapheading}}.@refill + +@item @@chapter @var{title} +Begin a chapter. The chapter title appears in the table of +contents of a printed manual. In Info, the title is underlined with +asterisks. @xref{chapter, , @code{@@chapter}}.@refill + +@item @@cindex @var{entry} +Add @var{entry} to the index of concepts. @xref{Index Entries, , +Defining the Entries of an Index}.@refill + +@item @@cite@{@var{reference}@} +Highlight the name of a book or other reference that lacks a +companion Info file. @xref{cite, , @code{@@cite}}.@refill + +@item @@clear @var{flag} +Unset @var{flag}, preventing the Texinfo formatting commands from +formatting text between subsequent pairs of @code{@@ifset @var{flag}} +and @code{@@end ifset} commands, and preventing +@code{@@value@{@var{flag}@}} from expanding to the value to which +@var{flag} is set. +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@item @@code@{@var{sample-code}@} +Highlight text that is an expression, a syntactically complete token +of a program, or a program name. @xref{code, , @code{@@code}}.@refill + +@item @@comment @var{comment} +Begin a comment in Texinfo. The rest of the line does not appear in +either the Info file or the printed manual. A synonym for @code{@@c}. +@xref{Comments, , Comments}.@refill + +@item @@contents +Print a complete table of contents. Has no effect in Info, which uses +menus instead. @xref{Contents, , Generating a Table of +Contents}.@refill + +@item @@copyright@{@} +Generate a copyright symbol. @xref{copyright symbol, , +@code{@@copyright}}.@refill + +@ignore +@item @@ctrl@{@var{ctrl-char}@} +Describe an @sc{ascii} control character. Insert actual control character +into Info file. @xref{ctrl, , @code{@@ctrl}}.@refill +@end ignore + +@item @@defcodeindex @var{index-name} +Define a new index and its indexing command. Print entries in an +@code{@@code} font. @xref{New Indices, , Defining New +Indices}.@refill + +@item @@defcv @var{category} @var{class} @var{name} +@itemx @@defcvx @var{category} @var{class} @var{name} +Format a description for a variable associated with a class in +object-oriented programming. Takes three arguments: the category of +thing being defined, the class to which it belongs, and its name. +@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}. + +@item @@deffn @var{category} @var{name} @var{arguments}@dots{} +@itemx @@deffnx @var{category} @var{name} @var{arguments}@dots{} +Format a description for a function, interactive command, or similar +entity that may take arguments. @code{@@deffn} takes as arguments the +category of entity being described, the name of this particular +entity, and its arguments, if any. @xref{Definition Commands}.@refill + +@item @@defindex @var{index-name} +Define a new index and its indexing command. Print entries in a roman +font. @xref{New Indices, , Defining New Indices}.@refill + +@c Unused so far as I can see and unsupported by makeinfo -- karl, 15sep96. +@item @@definfoenclose @var{new-command}, @var{before}, @var{after}, +Create new @@-command for Info that marks text by enclosing it in +strings that precede and follow the text. Write definition inside of +@code{@@ifinfo} @dots{} @code{@@end ifinfo}. @xref{Customized +Highlighting}.@refill + +@item @@defivar @var{class} @var{instance-variable-name} +@itemx @@defivarx @var{class} @var{instance-variable-name} +This command formats a description for an instance variable in +object-oriented programming. The command is equivalent to @samp{@@defcv +@{Instance Variable@} @dots{}}. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defmac @var{macro-name} @var{arguments}@dots{} +@itemx @@defmacx @var{macro-name} @var{arguments}@dots{} +Format a description for a macro. The command is equivalent to +@samp{@@deffn Macro @dots{}}. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defmethod @var{class} @var{method-name} @var{arguments}@dots{} +@itemx @@defmethodx @var{class} @var{method-name} @var{arguments}@dots{} +Format a description for a method in object-oriented programming. The +command is equivalent to @samp{@@defop Method @dots{}}. Takes as +arguments the name of the class of the method, the name of the +method, and its arguments, if any. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} +@itemx @@defopx @var{category} @var{class} @var{name} @var{arguments}@dots{} +Format a description for an operation in object-oriented programming. +@code{@@defop} takes as arguments the overall name of the category of +operation, the name of the class of the operation, the name of the +operation, and its arguments, if any. @xref{Definition +Commands}, and @ref{deffnx,, Def Cmds in Detail}. + +@item @@defopt @var{option-name} +@itemx @@defoptx @var{option-name} +Format a description for a user option. The command is equivalent to +@samp{@@defvr @{User Option@} @dots{}}. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defspec @var{special-form-name} @var{arguments}@dots{} +@itemx @@defspecx @var{special-form-name} @var{arguments}@dots{} +Format a description for a special form. The command is equivalent to +@samp{@@deffn @{Special Form@} @dots{}}. @xref{Definition Commands}, +and @ref{deffnx,, Def Cmds in Detail}. + +@item @@deftp @var{category} @var{name-of-type} @var{attributes}@dots{} +@itemx @@deftpx @var{category} @var{name-of-type} @var{attributes}@dots{} +Format a description for a data type. @code{@@deftp} takes as arguments +the category, the name of the type (which is a word like @samp{int} or +@samp{float}), and then the names of attributes of objects of that type. +@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}. + +@item @@deftypefn @var{classification} @var{data-type} @var{name} @var{arguments}@dots{} +@itemx @@deftypefnx @var{classification} @var{data-type} @var{name} @var{arguments}@dots{} +Format a description for a function or similar entity that may take +arguments and that is typed. @code{@@deftypefn} takes as arguments the +classification of entity being described, the type, the name of the +entity, and its arguments, if any. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@deftypefun @var{data-type} @var{function-name} @var{arguments}@dots{} +@itemx @@deftypefunx @var{data-type} @var{function-name} @var{arguments}@dots{} +Format a description for a function in a typed language. +The command is equivalent to @samp{@@deftypefn Function @dots{}}. +@xref{Definition Commands}, +and @ref{deffnx,, Def Cmds in Detail}. + +@item @@deftypemethod @var{class} @var{data-type} @var{method-name} @var{arguments}@dots{} +@itemx @@deftypemethodx @var{class} @var{data-type} @var{method-name} @var{arguments}@dots{} +Format a description for a typed method in object-oriented programming. +Takes as arguments the name of the class of the method, the return type +of the method, the name of the method, and its arguments, if any. +@xref{Definition Commands}, and @ref{deffnx,, Def Cmds in Detail}. + +@item @@deftypevr @var{classification} @var{data-type} @var{name} +@itemx @@deftypevrx @var{classification} @var{data-type} @var{name} +Format a description for something like a variable in a typed +language---an entity that records a value. Takes as arguments the +classification of entity being described, the type, and the name of the +entity. @xref{Definition Commands}, and @ref{deffnx,, Def Cmds in +Detail}. + +@item @@deftypevar @var{data-type} @var{variable-name} +@itemx @@deftypevarx @var{data-type} @var{variable-name} +Format a description for a variable in a typed language. The command is +equivalent to @samp{@@deftypevr Variable @dots{}}. @xref{Definition +Commands}, and @ref{deffnx,, Def Cmds in Detail}. + +@item @@defun @var{function-name} @var{arguments}@dots{} +@itemx @@defunx @var{function-name} @var{arguments}@dots{} +Format a description for functions. The command is equivalent to +@samp{@@deffn Function @dots{}}. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defvar @var{variable-name} +@itemx @@defvarx @var{variable-name} +Format a description for variables. The command is equivalent to +@samp{@@defvr Variable @dots{}}. @xref{Definition Commands}, and +@ref{deffnx,, Def Cmds in Detail}. + +@item @@defvr @var{category} @var{name} +@itemx @@defvrx @var{category} @var{name} +Format a description for any kind of variable. @code{@@defvr} takes +as arguments the category of the entity and the name of the entity. +@xref{Definition Commands}, +and @ref{deffnx,, Def Cmds in Detail}. + +@item @@detailmenu@{@} +Avoid @code{makeinfo} confusion stemming from the detailed node listing +in a master menu. @xref{Master Menu Parts}. + +@item @@dfn@{@var{term}@} +Highlight the introductory or defining use of a term. +@xref{dfn, , @code{@@dfn}}.@refill + +@item @@dircategory @var{dirpart} +Specify a part of the Info directory menu where this file's entry should +go. @xref{Installing Dir Entries}. + +@item @@direntry +Begin the Info directory menu entry for this file. +@xref{Installing Dir Entries}. + +@need 100 +@item @@display +Begin a kind of example. Indent text, do not fill, do not select a +new font. Pair with @code{@@end display}. @xref{display, , +@code{@@display}}.@refill + +@item @@dmn@{@var{dimension}@} +Format a unit of measure, as in 12@dmn{pt}. Causes @TeX{} to insert a +thin space before @var{dimension}. No effect in Info. +@xref{dmn, , @code{@@dmn}}.@refill + +@item @@dotaccent@{@var{c}@} +Generate a dot accent over the character @var{c}, as in @dotaccent{oo}. +@xref{Inserting Accents}. + +@item @@dots@{@} +Insert an ellipsis: @samp{@dots{}}. +@xref{dots, , @code{@@dots}}.@refill + +@item @@email@{@var{address}[, @var{displayed-text}]@} +Indicate an electronic mail address. +@xref{email, , @code{@@email}}.@refill + +@need 100 +@item @@emph@{@var{text}@} +Highlight @var{text}; text is displayed in @emph{italics} in printed +output, and surrounded by asterisks in Info. @xref{Emphasis, , +Emphasizing Text}. + +@item @@end @var{environment} +Ends @var{environment}, as in @samp{@@end example}. @xref{Formatting +Commands,,@@-commands}. + +@item @@enddots@{@} +Generate an end-of-sentence of ellipsis, like this @enddots{} +@xref{dots,,@code{@@dots@{@}}}. + +@need 100 +@item @@enumerate [@var{number-or-letter}] +Begin a numbered list, using @code{@@item} for each entry. +Optionally, start list with @var{number-or-letter}. Pair with +@code{@@end enumerate}. @xref{enumerate, , +@code{@@enumerate}}.@refill + +@need 100 +@item @@equiv@{@} +Indicate to the reader the exact equivalence of two forms with a +glyph: @samp{@equiv{}}. @xref{Equivalence}.@refill + +@item @@error@{@} +Indicate to the reader with a glyph that the following text is +an error message: @samp{@error{}}. @xref{Error Glyph}.@refill + +@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] +@itemx @@evenheading [@var{left}] @@| [@var{center}] @@| [@var{right}] +Specify page footings resp.@: headings for even-numbered (left-hand) +pages. Only allowed inside @code{@@iftex}. @xref{Custom Headings, , +How to Make Your Own Headings}.@refill + +@item @@everyfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] +@itemx @@everyheading [@var{left}] @@| [@var{center}] @@| [@var{right}] +Specify page footings resp.@: headings for every page. Not relevant to +Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill + +@item @@example +Begin an example. Indent text, do not fill, and select fixed-width font. +Pair with @code{@@end example}. @xref{example, , +@code{@@example}}.@refill + +@item @@exclamdown@{@} +Produce an upside-down exclamation point. @xref{Inserting Accents}. + +@item @@exdent @var{line-of-text} +Remove any indentation a line might have. @xref{exdent, , +Undoing the Indentation of a Line}.@refill + +@item @@expansion@{@} +Indicate the result of a macro expansion to the reader with a special +glyph: @samp{@expansion{}}. +@xref{expansion, , @expansion{} Indicating an Expansion}.@refill + +@item @@file@{@var{filename}@} +Highlight the name of a file, buffer, node, or directory. @xref{file, , +@code{@@file}}.@refill + +@item @@finalout +Prevent @TeX{} from printing large black warning rectangles beside +over-wide lines. @xref{Overfull hboxes}.@refill + +@need 100 +@item @@findex @var{entry} +Add @var{entry} to the index of functions. @xref{Index Entries, , +Defining the Entries of an Index}.@refill + +@need 200 +@item @@flushleft +@itemx @@flushright +Left justify every line but leave the right end ragged. +Leave font as is. Pair with @code{@@end flushleft}. +@code{@@flushright} analogous. +@xref{flushleft & flushright, , @code{@@flushleft} and +@code{@@flushright}}.@refill + +@need 200 +@item @@footnote@{@var{text-of-footnote}@} +Enter a footnote. Footnote text is printed at the bottom of the page +by @TeX{}; Info may format in either `End' node or `Separate' node style. +@xref{Footnotes}.@refill + +@item @@footnotestyle @var{style} +Specify an Info file's footnote style, either @samp{end} for the end +node style or @samp{separate} for the separate node style. +@xref{Footnotes}.@refill + +@item @@format +Begin a kind of example. Like @code{@@example} or @code{@@display}, +but do not narrow the margins and do not select the fixed-width font. +Pair with @code{@@end format}. @xref{example, , +@code{@@example}}.@refill + +@item @@ftable @var{formatting-command} +Begin a two-column table, using @code{@@item} for each entry. +Automatically enter each of the items in the first column into the +index of functions. Pair with @code{@@end ftable}. The same as +@code{@@table}, except for indexing. @xref{ftable vtable, , +@code{@@ftable} and @code{@@vtable}}.@refill + +@item @@group +Hold text together that must appear on one printed page. Pair with +@code{@@end group}. Not relevant to Info. @xref{group, , +@code{@@group}}.@refill + +@item @@H@{@var{c}@} +Generate the long Hungarian umlaut accent over @var{c}, as in @H{o}. + +@item @@heading @var{title} +Print an unnumbered section-like heading in the text, but not in the +table of contents of a printed manual. In Info, the title is +underlined with equal signs. @xref{unnumberedsec appendixsec heading, +, Section Commands}.@refill + +@item @@headings @var{on-off-single-double} +Turn page headings on or off, and/or specify single-sided or double-sided +page headings for printing. @xref{headings on off, , The +@code{@@headings} Command}. + +@item @@html +Enter HTML completely. Pair with @code{@@end html}. @xref{Raw +Formatter Commands}. + +@item @@hyphenation@{@var{hy-phen-a-ted words}@} +Explicitly define hyphenation points. @xref{- and hyphenation,, +@code{@@-} and @code{@@hyphenation}}. + +@item @@i@{@var{text}@} +Print @var{text} in @i{italic} font. No effect in Info. +@xref{Fonts}.@refill + +@item @@ifclear @var{flag} +If @var{flag} is cleared, the Texinfo formatting commands format text +between @code{@@ifclear @var{flag}} and the following @code{@@end +ifclear} command. +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@item @@ifhtml +@itemx @@ifinfo +Begin a stretch of text that will be ignored by @TeX{} when it typesets +the printed manual. The text appears only in the HTML resp.@: Info +file. Pair with @code{@@end ifhtml} resp.@: @code{@@end ifinfo}. +@xref{Conditionals}. + +@item @@ifnothtml +@itemx @@ifnotinfo +@itemx @@ifnottex +Begin a stretch of text that will be ignored in one output format but +not the others. The text appears only in the format not specified. +Pair with @code{@@end ifnothtml} resp.@: @code{@@end ifnotinfo} resp.@: +@code{@@end ifnotinfo}. @xref{Conditionals}. + +@item @@ifset @var{flag} +If @var{flag} is set, the Texinfo formatting commands format text +between @code{@@ifset @var{flag}} and the following @code{@@end ifset} +command. +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@item @@iftex +Begin a stretch of text that will not appear in the Info file, but +will be processed only by @TeX{}. Pair with @code{@@end iftex}. +@xref{Conditionals, , Conditionally Visible Text}.@refill + +@item @@ignore +Begin a stretch of text that will not appear in either the Info file +or the printed output. Pair with @code{@@end ignore}. +@xref{Comments, , Comments and Ignored Text}.@refill + +@item @@image@{@var{filename}, [@var{width}], [@var{height}]@} +Include graphics image in external @var{filename} scaled to the given +@var{width} and/or @var{height}. @xref{Images}. + +@item @@include @var{filename} +Incorporate the contents of the file @var{filename} into the Info file +or printed document. @xref{Include Files}.@refill + +@item @@inforef@{@var{node-name}, [@var{entry-name}], @var{info-file-name}@} +Make a cross reference to an Info file for which there is no printed +manual. @xref{inforef, , Cross references using +@code{@@inforef}}.@refill + +@item \input @var{macro-definitions-file} +Use the specified macro definitions file. This command is used only +in the first line of a Texinfo file to cause @TeX{} to make use of the +@file{texinfo} macro definitions file. The backslash in @code{\input} +is used instead of an @code{@@} because @TeX{} does not +recognize @code{@@} until after it has read the definitions file. +@xref{Header, , The Texinfo File Header}.@refill + +@item @@item +Indicate the beginning of a marked paragraph for @code{@@itemize} and +@code{@@enumerate}; indicate the beginning of the text of a first column +entry for @code{@@table}, @code{@@ftable}, and @code{@@vtable}. +@xref{Lists and Tables}.@refill + +@item @@itemize @var{mark-generating-character-or-command} +Produce a sequence of indented paragraphs, with a mark inside the left +margin at the beginning of each paragraph. Pair with @code{@@end +itemize}. @xref{itemize, , @code{@@itemize}}.@refill + +@item @@itemx +Like @code{@@item} but do not generate extra vertical space above the +item text. @xref{itemx, , @code{@@itemx}}.@refill + +@item @@kbd@{@var{keyboard-characters}@} +Indicate text that is characters of input to be typed by +users. @xref{kbd, , @code{@@kbd}}.@refill + +@item @@kbdinputstyle @var{style} +Specify when @code{@@kbd} should use a font distinct from @code{@@code}. +@xref{kbd, , @code{@@kbd}}.@refill + +@item @@key@{@var{key-name}@} +Indicate a name for a key on a keyboard. +@xref{key, , @code{@@key}}.@refill + +@item @@kindex @var{entry} +Add @var{entry} to the index of keys. +@xref{Index Entries, , Defining the Entries of an Index}.@refill + +@item @@L@{@} +@itemx @@l@{@} +Generate the uppercase and lowercase Polish suppressed-L letters, +respectively: @L{}, @l{}. + +@c Possibly this can be tossed now that we have macros. --karl, 16sep96. +@c Yes, let's toss it, it's pretty weird. --karl, 15jun97. +@c @item @@global@@let@var{new-command}=@var{existing-command} +@c Equate a new highlighting command with an existing one. Only for +@c @TeX{}. Write definition inside of @code{@@iftex} @dots{} @code{@@end +@c iftex}. @xref{Customized Highlighting}.@refill + +@item @@lisp +Begin an example of Lisp code. Indent text, do not fill, and select +fixed-width font. Pair with @code{@@end lisp}. @xref{Lisp Example, , +@code{@@lisp}}.@refill + +@item @@lowersections +Change subsequent chapters to sections, sections to subsections, and so +on. @xref{Raise/lower sections, , @code{@@raisesections} and +@code{@@lowersections}}.@refill + +@item @@macro @var{macro-name} @{@var{params}@} +Define a new Texinfo command @code{@@@var{macro-name}@{@var{params}@}}. +Only supported by @code{makeinfo} and @code{texi2dvi}. @xref{Defining +Macros}. + +@item @@majorheading @var{title} +Print a chapter-like heading in the text, but not in the table of +contents of a printed manual. Generate more vertical whitespace before +the heading than the @code{@@chapheading} command. In Info, the chapter +heading line is underlined with asterisks. @xref{majorheading & +chapheading, , @code{@@majorheading} and @code{@@chapheading}}.@refill + +@item @@math@{@var{mathematical-expression}@} +Format a mathematical expression. +@xref{math, , @code{@@math}: Inserting Mathematical Expressions}. + +@item @@menu +Mark the beginning of a menu of nodes in Info. No effect in a printed +manual. Pair with @code{@@end menu}. @xref{Menus}.@refill + +@item @@minus@{@} +Generate a minus sign, `@minus{}'. @xref{minus, , @code{@@minus}}.@refill + +@item @@multitable @var{column-width-spec} +Begin a multi-column table. Pair with @code{@@end multitable}. +@xref{Multitable Column Widths}. + +@item @@need @var{n} +Start a new page in a printed manual if fewer than @var{n} mils +(thousandths of an inch) remain on the current page. @xref{need, , +@code{@@need}}.@refill + +@item @@node @var{name, next, previous, up} +Define the beginning of a new node in Info, and serve as a locator for +references for @TeX{}. @xref{node, , @code{@@node}}.@refill + +@item @@noindent +Prevent text from being indented as if it were a new paragraph. +@xref{noindent, , @code{@@noindent}}.@refill + +@item @@O@{@} +@itemx @@o@{@} +Generate the uppercase and lowercase O-with-slash letters, respectively: +@O{}, @o{}. + +@item @@oddfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] +@itemx @@oddheading [@var{left}] @@| [@var{center}] @@| [@var{right}] +Specify page footings resp.@: headings for odd-numbered (right-hand) +pages. Only allowed inside @code{@@iftex}. @xref{Custom Headings, , +How to Make Your Own Headings}.@refill + +@item @@OE@{@} +@itemx @@oe@{@} +Generate the uppercase and lowercase OE ligatures, respectively: +@OE{}, @oe{}. @xref{Inserting Accents}. + +@item @@page +Start a new page in a printed manual. No effect in Info. +@xref{page, , @code{@@page}}.@refill + +@item @@paragraphindent @var{indent} +Indent paragraphs by @var{indent} number of spaces; delete indentation +if the value of @var{indent} is 0; and do not change indentation if +@var{indent} is @code{asis}. @xref{paragraphindent, , Paragraph +Indenting}.@refill + +@item @@pindex @var{entry} +Add @var{entry} to the index of programs. @xref{Index Entries, , Defining +the Entries of an Index}.@refill + +@item @@point@{@} +Indicate the position of point in a buffer to the reader with a +glyph: @samp{@point{}}. @xref{Point Glyph, , Indicating +Point in a Buffer}.@refill + +@item @@pounds@{@} +Generate the pounds sterling currency sign. +@xref{pounds,,@code{@@pounds@{@}}}. + +@item @@print@{@} +Indicate printed output to the reader with a glyph: +@samp{@print{}}. @xref{Print Glyph}.@refill + +@item @@printindex @var{index-name} +Print an alphabetized two-column index in a printed manual or generate +an alphabetized menu of index entries for Info. @xref{Printing +Indices & Menus}.@refill + +@item @@pxref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} +Make a reference that starts with a lower case `see' in a printed +manual. Use within parentheses only. Do not follow command with a +punctuation mark---the Info formatting commands automatically insert +terminating punctuation as needed. Only the first argument is mandatory. +@xref{pxref, , @code{@@pxref}}.@refill + +@item @@questiondown@{@} +Generate an upside-down question mark. @xref{Inserting Accents}. + +@item @@quotation +Narrow the margins to indicate text that is quoted from another real +or imaginary work. Write command on a line of its own. Pair with +@code{@@end quotation}. @xref{quotation, , +@code{@@quotation}}.@refill + +@need 100 +@item @@r@{@var{text}@} +Print @var{text} in @r{roman} font. No effect in Info. +@xref{Fonts}.@refill + +@item @@raisesections +Change subsequent sections to chapters, subsections to sections, and so +on. @xref{Raise/lower sections, , @code{@@raisesections} and +@code{@@lowersections}}.@refill + +@need 300 +@item @@ref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} +Make a reference. In a printed manual, the reference does not start +with a `See'. Follow command with a punctuation mark. Only the first +argument is mandatory. @xref{ref, , @code{@@ref}}.@refill + +@need 300 +@item @@refill +In Info, refill and indent the paragraph after all the other processing +has been done. No effect on @TeX{}, which always refills. This command +is no longer needed, since all formatters now automatically refill. +@xref{Refilling Paragraphs}.@refill + +@need 300 +@item @@result@{@} +Indicate the result of an expression to the reader with a special +glyph: @samp{@result{}}. @xref{result, , @code{@@result}}.@refill + +@item @@ringaccent@{@var{c}@} +Generate a ring accent over the next character, as in @ringaccent{o}. +@xref{Inserting Accents}. + +@item @@samp@{@var{text}@} +Highlight @var{text} that is a literal example of a sequence of +characters. Used for single characters, for statements, and often for +entire shell commands. @xref{samp, , @code{@@samp}}.@refill + +@item @@sc@{@var{text}@} +Set @var{text} in a printed output in @sc{the small caps font} and +set text in the Info file in uppercase letters. +@xref{Smallcaps}.@refill + +@item @@section @var{title} +Begin a section within a chapter. In a printed manual, the section +title is numbered and appears in the table of contents. In Info, the +title is underlined with equal signs. @xref{section, , +@code{@@section}}.@refill + +@item @@set @var{flag} [@var{string}] +Make @var{flag} active, causing the Texinfo formatting commands to +format text between subsequent pairs of @code{@@ifset @var{flag}} and +@code{@@end ifset} commands. Optionally, set value of @var{flag} to +@var{string}. +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@item @@setchapternewpage @var{on-off-odd} +Specify whether chapters start on new pages, and if so, whether on +odd-numbered (right-hand) new pages. @xref{setchapternewpage, , +@code{@@setchapternewpage}}.@refill + +@item @@setfilename @var{info-file-name} +Provide a name to be used by the Info file. This command is essential +for @TeX{} formatting as well, even though it produces no output. +@xref{setfilename, , @code{@@setfilename}}.@refill + +@item @@settitle @var{title} +Provide a title for page headers in a printed manual. +@xref{settitle, , @code{@@settitle}}.@refill + +@item @@shortcontents +Print a short table of contents. Not relevant to Info, which uses +menus rather than tables of contents. A synonym for +@code{@@summarycontents}. @xref{Contents, , Generating a Table of +Contents}.@refill + +@item @@shorttitlepage@{@var{title}@} +Generate a minimal title page. @xref{titlepage,,@code{@@titlepage}}. + +@need 400 +@item @@smallbook +Cause @TeX{} to produce a printed manual in a 7 by 9.25 inch format +rather than the regular 8.5 by 11 inch format. @xref{smallbook, , +Printing Small Books}. Also, see @ref{smallexample & smalllisp, , +@code{@@smallexample} and @code{@@smalllisp}}.@refill + +@need 400 +@item @@smallexample +Indent text to indicate an example. Do not fill, select fixed-width +font. In @code{@@smallbook} format, print text in a smaller font than +with @code{@@example}. Pair with @code{@@end smallexample}. +@xref{smallexample & smalllisp, , @code{@@smallexample} and +@code{@@smalllisp}}.@refill + +@need 400 +@item @@smalllisp +Begin an example of Lisp code. Indent text, do not fill, select +fixed-width font. In @code{@@smallbook} format, print text in a +smaller font. Pair with @code{@@end smalllisp}. @xref{smallexample & +smalllisp, , @code{@@smallexample} and @code{@@smalllisp}}.@refill + +@need 700 +@item @@sp @var{n} +Skip @var{n} blank lines. @xref{sp, , @code{@@sp}}.@refill + +@item @@ss@{@} +Generate the German sharp-S es-zet letter, @ss{}. @xref{Inserting Accents}. + +@need 700 +@item @@strong @var{text} +Emphasize @var{text} by typesetting it in a @strong{bold} font for the +printed manual and by surrounding it with asterisks for Info. +@xref{emph & strong, , Emphasizing Text}.@refill + +@item @@subheading @var{title} +Print an unnumbered subsection-like heading in the text, but not in +the table of contents of a printed manual. In Info, the title is +underlined with hyphens. @xref{unnumberedsubsec appendixsubsec +subheading, , @code{@@unnumberedsubsec} @code{@@appendixsubsec} +@code{@@subheading}}.@refill + +@item @@subsection @var{title} +Begin a subsection within a section. In a printed manual, the +subsection title is numbered and appears in the table of contents. In +Info, the title is underlined with hyphens. @xref{subsection, , +@code{@@subsection}}.@refill + +@item @@subsubheading @var{title} +Print an unnumbered subsubsection-like heading in the text, but not in +the table of contents of a printed manual. In Info, the title is +underlined with periods. @xref{subsubsection, , The `subsub' +Commands}.@refill + +@item @@subsubsection @var{title} +Begin a subsubsection within a subsection. In a printed manual, +the subsubsection title is numbered and appears in the table of +contents. In Info, the title is underlined with periods. +@xref{subsubsection, , The `subsub' Commands}.@refill + +@item @@subtitle @var{title} +In a printed manual, set a subtitle in a normal sized font flush to +the right-hand side of the page. Not relevant to Info, which does not +have title pages. @xref{title subtitle author, , @code{@@title} +@code{@@subtitle} and @code{@@author} Commands}.@refill + +@item @@summarycontents +Print a short table of contents. Not relevant to Info, which uses +menus rather than tables of contents. A synonym for +@code{@@shortcontents}. @xref{Contents, , Generating a Table of +Contents}.@refill + +@need 300 +@item @@syncodeindex @var{from-index} @var{into-index} +Merge the index named in the first argument into the index named in +the second argument, printing the entries from the first index in +@code{@@code} font. @xref{Combining Indices}.@refill + +@need 300 +@item @@synindex @var{from-index} @var{into-index} +Merge the index named in the first argument into the index named in +the second argument. Do not change the font of @var{from-index} +entries. @xref{Combining Indices}.@refill + +@need 100 +@item @@t@{@var{text}@} +Print @var{text} in a @t{fixed-width}, typewriter-like font. +No effect in Info. @xref{Fonts}.@refill + +@item @@tab +Separate columns in a multitable. @xref{Multitable Rows}. + +@need 400 +@item @@table @var{formatting-command} +Begin a two-column table, using @code{@@item} for each entry. Write +each first column entry on the same line as @code{@@item}. First +column entries are printed in the font resulting from +@var{formatting-command}. Pair with @code{@@end table}. +@xref{Two-column Tables, , Making a Two-column Table}. +Also see @ref{ftable vtable, , @code{@@ftable} and @code{@@vtable}}, +and @ref{itemx, , @code{@@itemx}}.@refill + +@item @@TeX@{@} +Insert the logo @TeX{}. @xref{TeX and copyright, , Inserting @TeX{} +and @copyright{}}.@refill + +@item @@tex +Enter @TeX{} completely. Pair with @code{@@end tex}. @xref{Raw +Formatter Commands}. + +@item @@thischapter +@itemx @@thischaptername +@itemx @@thisfile +@itemx @@thispage +@itemx @@thistitle +Only allowed in a heading or footing. Stands for the number and name of +the current chapter (in the format `Chapter 1: Title'), the chapter name +only, the filename, the current page number, and the title of the +document, respectively. @xref{Custom Headings, , How to Make Your Own +Headings}.@refill + +@item @@tieaccent@{@var{cc}@} +Generate a tie-after accent over the next two characters @var{cc}, as in +`@tieaccent{oo}'. @xref{Inserting Accents}. + +@item @@tindex @var{entry} +Add @var{entry} to the index of data types. @xref{Index Entries, , +Defining the Entries of an Index}.@refill + +@item @@title @var{title} +In a printed manual, set a title flush to the left-hand side of the +page in a larger than normal font and underline it with a black rule. +Not relevant to Info, which does not have title pages. @xref{title +subtitle author, , The @code{@@title} @code{@@subtitle} and +@code{@@author} Commands}.@refill + +@need 400 +@item @@titlefont@{@var{text}@} +In a printed manual, print @var{text} in a larger than normal font. +Not relevant to Info, which does not have title pages. +@xref{titlefont center sp, , The @code{@@titlefont} @code{@@center} +and @code{@@sp} Commands}.@refill + +@need 300 +@item @@titlepage +Indicate to Texinfo the beginning of the title page. Write command on +a line of its own. Pair with @code{@@end titlepage}. Nothing between +@code{@@titlepage} and @code{@@end titlepage} appears in Info. +@xref{titlepage, , @code{@@titlepage}}.@refill + +@need 150 +@item @@today@{@} +Insert the current date, in `1 Jan 1900' style. @xref{Custom +Headings, , How to Make Your Own Headings}.@refill + +@item @@top @var{title} +In a Texinfo file to be formatted with @code{makeinfo}, identify the +topmost @code{@@node} line in the file, which must be written on the line +immediately preceding the @code{@@top} command. Used for +@code{makeinfo}'s node pointer insertion feature. The title is +underlined with asterisks. Both the @code{@@node} line and the @code{@@top} +line normally should be enclosed by @code{@@ifinfo} and @code{@@end +ifinfo}. In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top} +command is merely a synonym for @code{@@unnumbered}. @xref{makeinfo +Pointer Creation, , Creating Pointers with @code{makeinfo}}. + +@item @@u@{@var{c}@} +@itemx @@ubaraccent@{@var{c}@} +@itemx @@udotaccent@{@var{c}@} +Generate a breve, underbar, or underdot accent, respectively, over or +under the character @var{c}, as in @u{o}, @ubaraccent{o}, +@udotaccent{o}. @xref{Inserting Accents}. + +@item @@unnumbered @var{title} +In a printed manual, begin a chapter that appears without chapter +numbers of any kind. The title appears in the table of contents of a +printed manual. In Info, the title is underlined with asterisks. +@xref{unnumbered & appendix, , @code{@@unnumbered} and +@code{@@appendix}}.@refill + +@item @@unnumberedsec @var{title} +In a printed manual, begin a section that appears without section +numbers of any kind. The title appears in the table of contents of a +printed manual. In Info, the title is underlined with equal signs. +@xref{unnumberedsec appendixsec heading, , Section Commands}.@refill + +@item @@unnumberedsubsec @var{title} +In a printed manual, begin an unnumbered subsection within a +chapter. The title appears in the table of contents of a printed +manual. In Info, the title is underlined with hyphens. +@xref{unnumberedsubsec appendixsubsec subheading, , +@code{@@unnumberedsubsec} @code{@@appendixsubsec} +@code{@@subheading}}.@refill + +@item @@unnumberedsubsubsec @var{title} +In a printed manual, begin an unnumbered subsubsection within a +chapter. The title appears in the table of contents of a printed +manual. In Info, the title is underlined with periods. +@xref{subsubsection, , The `subsub' Commands}.@refill + +@item @@uref@{@var{url}[, @var{displayed-text}@} +Define a cross reference to an external uniform resource locator for the +World Wide Web. @xref{url, , @code{@@url}}.@refill + +@item @@url@{@var{url}@} +Indicate text that is a uniform resource locator for the World Wide +Web. @xref{url, , @code{@@url}}.@refill + +@item @@v@{@var{c}@} +Generate check accent over the character @var{c}, as in @v{o}. +@xref{Inserting Accents}. + +@item @@value@{@var{flag}@} +Replace @var{flag} with the value to which it is set by @code{@@set +@var{flag}}. +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@item @@var@{@var{metasyntactic-variable}@} +Highlight a metasyntactic variable, which is something that stands for +another piece of text. @xref{var, , Indicating Metasyntactic +Variables}.@refill + +@need 400 +@item @@vindex @var{entry} +Add @var{entry} to the index of variables. @xref{Index Entries, , +Defining the Entries of an Index}.@refill + +@need 400 +@item @@vskip @var{amount} +In a printed manual, insert whitespace so as to push text on the +remainder of the page towards the bottom of the page. Used in +formatting the copyright page with the argument @samp{0pt plus +1filll}. (Note spelling of @samp{filll}.) @code{@@vskip} may be used +only in contexts ignored for Info. @xref{Copyright & Permissions, , +The Copyright Page and Printed Permissions}.@refill + +@need 400 +@item @@vtable @var{formatting-command} +Begin a two-column table, using @code{@@item} for each entry. +Automatically enter each of the items in the first column into the +index of variables. Pair with @code{@@end vtable}. The same as +@code{@@table}, except for indexing. @xref{ftable vtable, , +@code{@@ftable} and @code{@@vtable}}.@refill + +@need 400 +@item @@w@{@var{text}@} +Prevent @var{text} from being split across two lines. Do not end a +paragraph that uses @code{@@w} with an @code{@@refill} command. +@xref{w, , @code{@@w}}.@refill + +@need 400 +@item @@xref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} +Make a reference that starts with `See' in a printed manual. Follow +command with a punctuation mark. Only the first argument is +mandatory. @xref{xref, , @code{@@xref}}.@refill +@end table + + +@node Tips, Sample Texinfo File, Command List, Top +@appendix Tips and Hints + +Here are some tips for writing Texinfo documentation:@refill + +@cindex Tips +@cindex Usage tips +@cindex Hints +@itemize @bullet +@item +Write in the present tense, not in the past or the future. + +@item +Write actively! For example, write ``We recommend that @dots{}'' rather +than ``It is recommended that @dots{}''. + +@item +Use 70 or 72 as your fill column. Longer lines are hard to read. + +@item +Include a copyright notice and copying permissions. +@end itemize + +@subsubheading Index, Index, Index! + +Write many index entries, in different ways. +Readers like indices; they are helpful and convenient. + +Although it is easiest to write index entries as you write the body of +the text, some people prefer to write entries afterwards. In either +case, write an entry before the paragraph to which it applies. This +way, an index entry points to the first page of a paragraph that is +split across pages. + +Here are more hints we have found valuable: + +@itemize @bullet +@item +Write each index entry differently, so each entry refers to a different +place in the document. + +@item +Write index entries only where a topic is discussed significantly. For +example, it is not useful to index ``debugging information'' in a +chapter on reporting bugs. Someone who wants to know about debugging +information will certainly not find it in that chapter. + +@item +Consistently capitalize the first word of every concept index entry, +or else consistently use lower case. Terse entries often call for +lower case; longer entries for capitalization. Whichever case +convention you use, please use one or the other consistently! Mixing +the two styles looks bad. + +@item +Always capitalize or use upper case for those words in an index for +which this is proper, such as names of countries or acronyms. Always +use the appropriate case for case-sensitive names, such as those in C or +Lisp. + +@item +Write the indexing commands that refer to a whole section immediately +after the section command, and write the indexing commands that refer to +the paragraph before the paragraph. + +@need 1000 +In the example that follows, a blank line comes after the index +entry for ``Leaping'': + +@example +@group +@@section The Dog and the Fox +@@cindex Jumping, in general +@@cindex Leaping + +@@cindex Dog, lazy, jumped over +@@cindex Lazy dog jumped over +@@cindex Fox, jumps over dog +@@cindex Quick fox jumps over dog +The quick brown fox jumps over the lazy dog. +@end group +@end example + +@noindent +(Note that the example shows entries for the same concept that are +written in different ways---@samp{Lazy dog}, and @samp{Dog, lazy}---so +readers can look up the concept in different ways.) +@end itemize + +@subsubheading Blank Lines + +@itemize @bullet +@item +Insert a blank line between a sectioning command and the first following +sentence or paragraph, or between the indexing commands associated with +the sectioning command and the first following sentence or paragraph, as +shown in the tip on indexing. Otherwise, a formatter may fold title and +paragraph together. + +@item +Always insert a blank line before an @code{@@table} command and after an +@code{@@end table} command; but never insert a blank line after an +@code{@@table} command or before an @code{@@end table} command. + +@need 1000 +For example, + +@example +@group +Types of fox: + +@@table @@samp +@@item Quick +Jump over lazy dogs. +@end group + +@group +@@item Brown +Also jump over lazy dogs. +@@end table + +@end group +@group +@@noindent +On the other hand, @dots{} +@end group +@end example + +Insert blank lines before and after @code{@@itemize} @dots{} @code{@@end +itemize} and @code{@@enumerate} @dots{} @code{@@end enumerate} in the +same way. +@end itemize + +@subsubheading Complete Phrases + +Complete phrases are easier to read than @dots{} + +@itemize @bullet +@item +Write entries in an itemized list as complete sentences; or at least, as +complete phrases. Incomplete expressions @dots{} awkward @dots{} like +this. + +@item +Write the prefatory sentence or phrase for a multi-item list or table as +a complete expression. Do not write ``You can set:''; instead, write +``You can set these variables:''. The former expression sounds cut off. +@end itemize + +@subsubheading Editions, Dates and Versions + +Write the edition and version numbers and date in three places in every +manual: + +@enumerate +@item +In the first @code{@@ifinfo} section, for people reading the Texinfo file. + +@item +In the @code{@@titlepage} section, for people reading the printed manual. + +@item +In the `Top' node, for people reading the Info file. +@end enumerate + +@noindent +Also, it helps to write a note before the first @code{@@ifinfo} +section to explain what you are doing. + +@need 800 +@noindent +For example: + +@example +@group +@@c ===> NOTE! <== +@@c Specify the edition and version numbers and date +@@c in *three* places: +@@c 1. First ifinfo section 2. title page 3. top node +@@c To find the locations, search for !!set +@end group + +@group +@@ifinfo +@@c !!set edition, date, version +This is Edition 4.03, January 1992, +of the @@cite@{GDB Manual@} for GDB Version 4.3. +@dots{} +@end group +@end example + +@noindent +---or use @code{@@set} and @code{@@value} +(@pxref{value Example, , @code{@@value} Example}). + +@subsubheading Definition Commands + +Definition commands are @code{@@deffn}, @code{@@defun}, +@code{@@defmac}, and the like, and enable you to write descriptions in +a uniform format.@refill + +@itemize @bullet +@item +Write just one definition command for each entity you define with a +definition command. The automatic indexing feature creates an index +entry that leads the reader to the definition. + +@item +Use @code{@@table} @dots{} @code{@@end table} in an appendix that +contains a summary of functions, not @code{@@deffn} or other definition +commands. +@end itemize + +@subsubheading Capitalization + +@itemize @bullet +@item +Capitalize ``Texinfo''; it is a name. Do not write the @samp{x} or +@samp{i} in upper case. + +@item +Capitalize ``Info''; it is a name. + +@item +Write @TeX{} using the @code{@@TeX@{@}} command. Note the uppercase +@samp{T} and @samp{X}. This command causes the formatters to +typeset the name according to the wishes of Donald Knuth, who wrote +@TeX{}. +@end itemize + +@subsubheading Spaces + +Do not use spaces to format a Texinfo file, except inside of +@code{@@example} @dots{} @code{@@end example} and similar commands. + +@need 700 +For example, @TeX{} fills the following: + +@example +@group + @@kbd@{C-x v@} + @@kbd@{M-x vc-next-action@} + Perform the next logical operation + on the version-controlled file + corresponding to the current buffer. +@end group +@end example + +@need 950 +@noindent +so it looks like this: + +@iftex +@quotation + @kbd{C-x v} + @kbd{M-x vc-next-action} + Perform the next logical operation on the version-controlled file + corresponding to the current buffer. +@end quotation +@end iftex +@ifinfo +@quotation +`C-x v' `M-x vc-next-action' Perform the next logical operation on the +version-controlled file corresponding to the current buffer. +@end quotation +@end ifinfo + +@noindent +In this case, the text should be formatted with +@code{@@table}, @code{@@item}, and @code{@@itemx}, to create a table. + +@subsubheading @@code, @@samp, @@var, and @samp{---} + +@itemize @bullet +@item +Use @code{@@code} around Lisp symbols, including command names. +For example, + +@example +The main function is @@code@{vc-next-action@}, @dots{} +@end example + +@item +Avoid putting letters such as @samp{s} immediately after an +@samp{@@code}. Such letters look bad. + +@item +Use @code{@@var} around meta-variables. Do not write angle brackets +around them. + +@item +Use three hyphens in a row, @samp{---}, to indicate a long dash. @TeX{} +typesets these as a long dash and the Info formatters reduce three +hyphens to two. +@end itemize + +@subsubheading Periods Outside of Quotes + +Place periods and other punctuation marks @emph{outside} of quotations, +unless the punctuation is part of the quotation. This practice goes +against publishing conventions in the United States, but enables the +reader to distinguish between the contents of the quotation and the +whole passage. + +For example, you should write the following sentence with the period +outside the end quotation marks: + +@example +Evidently, @samp{au} is an abbreviation for ``author''. +@end example + +@noindent +since @samp{au} does @emph{not} serve as an abbreviation for +@samp{author.} (with a period following the word). + +@subsubheading Introducing New Terms + +@itemize @bullet +@item +Introduce new terms so that a reader who does not know them can +understand them from context; or write a definition for the term. + +For example, in the following, the terms ``check in'', ``register'' and +``delta'' are all appearing for the first time; the example sentence should be +rewritten so they are understandable. + +@quotation +The major function assists you in checking in a file to your +version control system and registering successive sets of changes to +it as deltas. +@end quotation + +@item +Use the @code{@@dfn} command around a word being introduced, to indicate +that the reader should not expect to know the meaning already, and +should expect to learn the meaning from this passage. +@end itemize + +@subsubheading @@pxref + +@c !!! maybe include this in the tips on pxref +@ignore +By the way, it is okay to use pxref with something else in front of +it within the parens, as long as the pxref is followed by the close +paren, and the material inside the parens is not part of a larger +sentence. Also, you can use xref inside parens as part of a complete +sentence so long as you terminate the cross reference with punctuation. +@end ignore +Absolutely never use @code{@@pxref} except in the special context for +which it is designed: inside parentheses, with the closing parenthesis +following immediately after the closing brace. One formatter +automatically inserts closing punctuation and the other does not. This +means that the output looks right both in printed output and in an Info +file, but only when the command is used inside parentheses. + +@subsubheading Invoking from a Shell + +You can invoke programs such as Emacs, GCC, and @code{gawk} from a +shell. The documentation for each program should contain a section that +describes this. Unfortunately, if the node names and titles for these +sections are all different, readers find it hard to search for the +section.@refill + +Name such sections with a phrase beginning with the word +@w{`Invoking @dots{}'}, as in `Invoking Emacs'; this way +users can find the section easily. + +@subsubheading ANSI C Syntax + +When you use @code{@@example} to describe a C function's calling +conventions, use the ANSI C syntax, like this:@refill + +@example +void dld_init (char *@@var@{path@}); +@end example + +@noindent +And in the subsequent discussion, refer to the argument values by +writing the same argument names, again highlighted with +@code{@@var}.@refill + +@need 800 +Avoid the obsolete style that looks like this:@refill + +@example +#include <dld.h> + +dld_init (path) +char *path; +@end example + +Also, it is best to avoid writing @code{#include} above the +declaration just to indicate that the function is declared in a +header file. The practice may give the misimpression that the +@code{#include} belongs near the declaration of the function. Either +state explicitly which header file holds the declaration or, better +yet, name the header file used for a group of functions at the +beginning of the section that describes the functions.@refill + +@subsubheading Bad Examples + +Here are several examples of bad writing to avoid: + +In this example, say, `` @dots{} you must @code{@@dfn}@{check +in@} the new version.'' That flows better. + +@quotation +When you are done editing the file, you must perform a +@code{@@dfn}@{check in@}. +@end quotation + +In the following example, say, ``@dots{} makes a unified interface such as VC +mode possible.'' + +@quotation +SCCS, RCS and other version-control systems all perform similar +functions in broadly similar ways (it is this resemblance which makes +a unified control mode like this possible). +@end quotation + +And in this example, you should specify what `it' refers to: + +@quotation +If you are working with other people, it assists in coordinating +everyone's changes so they do not step on each other. +@end quotation + +@subsubheading And Finally @dots{} + +@itemize @bullet +@item +Pronounce @TeX{} as if the @samp{X} were a Greek `chi', as the last +sound in the name `Bach'. But pronounce Texinfo as in `speck': +``teckinfo''. + +@item +Write notes for yourself at the very end of a Texinfo file after the +@code{@@bye}. None of the formatters process text after the +@code{@@bye}; it is as if the text were within @code{@@ignore} @dots{} +@code{@@end ignore}. +@end itemize + + +@node Sample Texinfo File, Sample Permissions, Tips, Top +@appendix A Sample Texinfo File +@cindex Sample Texinfo file, no comments + +Here is a complete, short sample Texinfo file, without any commentary. +You can see this file, with comments, in the first chapter. +@xref{Short Sample, , A Short Sample Texinfo File}. + +@sp 1 +@example +\input texinfo @@c -*-texinfo-*- +@@c %**start of header +@@setfilename sample.info +@@settitle Sample Document +@@c %**end of header + +@@setchapternewpage odd + +@@ifinfo +This is a short example of a complete Texinfo file. + +Copyright 1990 Free Software Foundation, Inc. +@@end ifinfo + +@@titlepage +@@sp 10 +@@comment The title is printed in a large font. +@@center @@titlefont@{Sample Title@} + +@@c The following two commands start the copyright page. +@@page +@@vskip 0pt plus 1filll +Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. +@@end titlepage + +@@node Top, First Chapter, , (dir) +@@comment node-name, next, previous, up + +@@menu +* First Chapter:: The first chapter is the + only chapter in this sample. +* Concept Index:: This index has two entries. +@@end menu + +@@node First Chapter, Concept Index, Top, Top +@@comment node-name, next, previous, up +@@chapter First Chapter +@@cindex Sample index entry + +This is the contents of the first chapter. +@@cindex Another sample index entry + +Here is a numbered list. + +@@enumerate +@@item +This is the first item. + +@@item +This is the second item. +@@end enumerate + +The @@code@{makeinfo@} and @@code@{texinfo-format-buffer@} +commands transform a Texinfo file such as this into +an Info file; and @@TeX@{@} typesets it for a printed +manual. + +@@node Concept Index, , First Chapter, Top +@@comment node-name, next, previous, up +@@unnumbered Concept Index + +@@printindex cp + +@@contents +@@bye +@end example + + +@node Sample Permissions, Include Files, Sample Texinfo File, Top +@appendix Sample Permissions +@cindex Permissions +@cindex Copying permissions + +Texinfo files should contain sections that tell the readers that they +have the right to copy and distribute the Texinfo file, the Info file, +and the printed manual.@refill + +Also, if you are writing a manual about software, you should explain +that the software is free and either include the GNU General Public +License (GPL) or provide a reference to it. @xref{Distrib, , +Distribution, emacs, The GNU Emacs Manual}, for an example of the text +that could be used in the software ``Distribution'', ``General Public +License'', and ``NO WARRANTY'' sections of a document. @xref{Copying, +, Texinfo Copying Conditions}, for an example of a brief explanation +of how the copying conditions provide you with rights. @refill + +@menu +* Inserting Permissions:: How to put permissions in your document. +* ifinfo Permissions:: Sample @samp{ifinfo} copying permissions. +* Titlepage Permissions:: Sample Titlepage copying permissions. +@end menu + +@node Inserting Permissions, ifinfo Permissions, Sample Permissions, Sample Permissions +@ifinfo +@appendixsec Inserting Permissions +@end ifinfo + +In a Texinfo file, the first @code{@@ifinfo} section usually begins +with a line that says what the file documents. This is what a person +reading the unprocessed Texinfo file or using the advanced Info +command @kbd{g *} sees first. @inforef{Expert, Advanced Info +commands, info}, for more information. (A reader using the regular +Info commands usually starts reading at the first node and skips +this first section, which is not in a node.)@refill + +In the @code{@@ifinfo} section, the summary sentence is followed by a +copyright notice and then by the copying permission notice. One of +the copying permission paragraphs is enclosed in @code{@@ignore} and +@code{@@end ignore} commands. This paragraph states that the Texinfo +file can be processed through @TeX{} and printed, provided the printed +manual carries the proper copying permission notice. This paragraph +is not made part of the Info file since it is not relevant to the Info +file; but it is a mandatory part of the Texinfo file since it permits +people to process the Texinfo file in @TeX{} and print the +results.@refill + +In the printed manual, the Free Software Foundation copying permission +notice follows the copyright notice and publishing information and is +located within the region delineated by the @code{@@titlepage} and +@code{@@end titlepage} commands. The copying permission notice is exactly +the same as the notice in the @code{@@ifinfo} section except that the +paragraph enclosed in @code{@@ignore} and @code{@@end ignore} commands is +not part of the notice.@refill + +To make it simple to insert a permission notice into each section of +the Texinfo file, sample permission notices for each section are +reproduced in full below.@refill + +Note that you may need to specify the correct name of a section +mentioned in the permission notice. For example, in @cite{The GDB +Manual}, the name of the section referring to the General Public +License is called the ``GDB General Public License'', but in the +sample shown below, that section is referred to generically as the +``GNU General Public License''. If the Texinfo file does not carry a +copy of the General Public License, leave out the reference to it, but +be sure to include the rest of the sentence.@refill + +@node ifinfo Permissions, Titlepage Permissions, Inserting Permissions, Sample Permissions +@comment node-name, next, previous, up +@appendixsec @samp{ifinfo} Copying Permissions +@cindex @samp{ifinfo} permissions + +In the @code{@@ifinfo} section of a Texinfo file, the standard Free +Software Foundation permission notice reads as follows:@refill + +@example +This file documents @dots{} + +Copyright 1997 Free Software Foundation, Inc. + +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. + +@@ignore +Permission is granted to process this file through TeX +and print the results, provided the printed document +carries a copying permission notice identical to this +one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +@@end ignore +Permission is granted to copy and distribute modified +versions of this manual under the conditions for +verbatim copying, provided also that the sections +entitled ``Copying'' and ``GNU General Public License'' +are included exactly as in the original, and provided +that the entire resulting derived work is distributed +under the terms of a permission notice identical to this +one. + +Permission is granted to copy and distribute +translations of this manual into another language, +under the above conditions for modified versions, +except that this permission notice may be stated in a +translation approved by the Free Software Foundation. +@end example + +@node Titlepage Permissions, , ifinfo Permissions, Sample Permissions +@comment node-name, next, previous, up +@appendixsec Titlepage Copying Permissions +@cindex Titlepage permissions + +In the @code{@@titlepage} section of a Texinfo file, the standard Free +Software Foundation copying permission notice follows the copyright +notice and publishing information. The standard phrasing is as +follows:@refill + +@example +Permission is granted to make and distribute verbatim +copies of this manual provided the copyright notice and +this permission notice are preserved on all copies. + +Permission is granted to copy and distribute modified +versions of this manual under the conditions for +verbatim copying, provided also that the sections +entitled ``Copying'' and ``GNU General Public License'' +are included exactly as in the original, and provided +that the entire resulting derived work is distributed +under the terms of a permission notice identical to this +one. + +Permission is granted to copy and distribute +translations of this manual into another language, +under the above conditions for modified versions, +except that this permission notice may be stated in a +translation approved by the Free Software Foundation. +@end example + + +@node Include Files, Headings, Sample Permissions, Top +@appendix Include Files +@cindex Include files + +When @TeX{} or an Info formatting command sees an @code{@@include} +command in a Texinfo file, it processes the contents of the file named +by the command and incorporates them into the DVI or Info file being +created. Index entries from the included file are incorporated into +the indices of the output file.@refill + +Include files let you keep a single large document as a collection of +conveniently small parts.@refill + +@menu +* Using Include Files:: How to use the @code{@@include} command. +* texinfo-multiple-files-update:: How to create and update nodes and + menus when using included files. +* Include File Requirements:: What @code{texinfo-multiple-files-update} expects. +* Sample Include File:: A sample outer file with included files + within it; and a sample included file. +* Include Files Evolution:: How use of the @code{@@include} command + has changed over time. +@end menu + +@node Using Include Files, texinfo-multiple-files-update, Include Files, Include Files +@appendixsec How to Use Include Files +@findex include + +To include another file within a Texinfo file, write the +@code{@@include} command at the beginning of a line and follow it on +the same line by the name of a file to be included. For +example:@refill + +@example +@@include buffers.texi +@end example + +An included file should simply be a segment of text that you expect to +be included as is into the overall or @dfn{outer} Texinfo file; it +should not contain the standard beginning and end parts of a Texinfo +file. In particular, you should not start an included file with a +line saying @samp{\input texinfo}; if you do, that phrase is inserted +into the output file as is. Likewise, you should not end an included +file with an @code{@@bye} command; nothing after @code{@@bye} is +formatted.@refill + +In the past, you were required to write an @code{@@setfilename} line at the +beginning of an included file, but no longer. Now, it does not matter +whether you write such a line. If an @code{@@setfilename} line exists +in an included file, it is ignored.@refill + +Conventionally, an included file begins with an @code{@@node} line that +is followed by an @code{@@chapter} line. Each included file is one +chapter. This makes it easy to use the regular node and menu creating +and updating commands to create the node pointers and menus within the +included file. However, the simple Emacs node and menu creating and +updating commands do not work with multiple Texinfo files. Thus you +cannot use these commands to fill in the `Next', `Previous', and `Up' +pointers of the @code{@@node} line that begins the included file. Also, +you cannot use the regular commands to create a master menu for the +whole file. Either you must insert the menus and the `Next', +`Previous', and `Up' pointers by hand, or you must use the GNU Emacs +Texinfo mode command, @code{texinfo-multiple-files-update}, that is +designed for @code{@@include} files.@refill + +@node texinfo-multiple-files-update, Include File Requirements, Using Include Files, Include Files +@appendixsec @code{texinfo-multiple-files-update} +@findex texinfo-multiple-files-update + +GNU Emacs Texinfo mode provides the @code{texinfo-multiple-files-update} +command. This command creates or updates `Next', `Previous', and `Up' +pointers of included files as well as those in the outer or overall +Texinfo file, and it creates or updates a main menu in the outer file. +Depending whether you call it with optional arguments, the command +updates only the pointers in the first @code{@@node} line of the +included files or all of them:@refill + +@table @kbd +@item M-x texinfo-multiple-files-update +Called without any arguments:@refill + +@itemize @minus +@item +Create or update the `Next', `Previous', and `Up' pointers of the +first @code{@@node} line in each file included in an outer or overall +Texinfo file.@refill + +@item +Create or update the `Top' level node pointers of the outer or +overall file.@refill + +@item +Create or update a main menu in the outer file.@refill +@end itemize + +@item C-u M-x texinfo-multiple-files-update +Called with @kbd{C-u} as a prefix argument: + +@itemize @minus{} +@item +Create or update pointers in the first @code{@@node} line in each +included file. + +@item +Create or update the `Top' level node pointers of the outer file. + +@item +Create and insert a master menu in the outer file. The master menu +is made from all the menus in all the included files.@refill +@end itemize + +@item C-u 8 M-x texinfo-multiple-files-update +Called with a numeric prefix argument, such as @kbd{C-u 8}: + +@itemize @minus +@item +Create or update @strong{all} the `Next', `Previous', and `Up' pointers +of all the included files.@refill + +@item +Create or update @strong{all} the menus of all the included +files.@refill + +@item +Create or update the `Top' level node pointers of the outer or +overall file.@refill + +@item +And then create a master menu in the outer file. This is similar to +invoking @code{texinfo-master-menu} with an argument when you are +working with just one file.@refill +@end itemize +@end table + +Note the use of the prefix argument in interactive use: with a regular +prefix argument, just @w{@kbd{C-u}}, the +@code{texinfo-multiple-files-update} command inserts a master menu; +with a numeric prefix argument, such as @kbd{C-u 8}, the command +updates @strong{every} pointer and menu in @strong{all} the files and then inserts a +master menu.@refill + +@node Include File Requirements, Sample Include File, texinfo-multiple-files-update, Include Files +@appendixsec Include File Requirements +@cindex Include file requirements +@cindex Requirements for include files + +If you plan to use the @code{texinfo-multiple-files-update} command, +the outer Texinfo file that lists included files within it should +contain nothing but the beginning and end parts of a Texinfo file, and +a number of @code{@@include} commands listing the included files. It +should not even include indices, which should be listed in an included +file of their own.@refill + +Moreover, each of the included files must contain exactly one highest +level node (conventionally, @code{@@chapter} or equivalent), +and this node must be the first node in the included file. +Furthermore, each of these highest level nodes in each included file +must be at the same hierarchical level in the file structure. +Usually, each is an @code{@@chapter}, an @code{@@appendix}, or an +@code{@@unnumbered} node. Thus, normally, each included file contains +one, and only one, chapter or equivalent-level node.@refill + +The outer file should contain only @emph{one} node, the `Top' node. It +should @emph{not} contain any nodes besides the single `Top' node. The +@code{texinfo-multiple-files-update} command will not process +them.@refill + +@node Sample Include File, Include Files Evolution, Include File Requirements, Include Files +@appendixsec Sample File with @code{@@include} +@cindex Sample @code{@@include} file +@cindex Include file sample +@cindex @code{@@include} file sample + +Here is an example of a complete outer Texinfo file with @code{@@include} files +within it before running @code{texinfo-multiple-files-update}, which +would insert a main or master menu:@refill + +@example +@group +\input texinfo @@c -*-texinfo-*- +@c %**start of header +@@setfilename include-example.info +@@settitle Include Example +@c %**end of header +@end group + +@group +@@setchapternewpage odd +@@titlepage +@@sp 12 +@@center @@titlefont@{Include Example@} +@@sp 2 +@@center by Whom Ever +@end group + +@group +@@page +@@vskip 0pt plus 1filll +Copyright @@copyright@{@} 1997 Free Software Foundation, Inc. +@@end titlepage +@end group + +@group +@@ifinfo +@@node Top, First, , (dir) +@@top Master Menu +@@end ifinfo +@end group + +@group +@@include foo.texinfo +@@include bar.texinfo +@@include concept-index.texinfo +@end group + +@group +@@summarycontents +@@contents + +@@bye +@end group +@end example + +An included file, such as @file{foo.texinfo}, might look like +this:@refill + +@example +@group +@@node First, Second, , Top +@@chapter First Chapter + +Contents of first chapter @dots{} +@end group +@end example + +The full contents of @file{concept-index.texinfo} might be as simple as this: + +@example +@group +@@node Concept Index, , Second, Top +@@unnumbered Concept Index + +@@printindex cp +@end group +@end example + +The outer Texinfo source file for @cite{The GNU Emacs Lisp Reference +Manual} is named @file{elisp.texi}. This outer file contains a master +menu with 417 entries and a list of 41 @code{@@include} +files.@refill + +@node Include Files Evolution, , Sample Include File, Include Files +@comment node-name, next, previous, up +@appendixsec Evolution of Include Files + +When Info was first created, it was customary to create many small +Info files on one subject. Each Info file was formatted from its own +Texinfo source file. This custom meant that Emacs did not need to +make a large buffer to hold the whole of a large Info file when +someone wanted information; instead, Emacs allocated just enough +memory for the small Info file that contained the particular +information sought. This way, Emacs could avoid wasting memory.@refill + +References from one file to another were made by referring to the file +name as well as the node name. (@xref{Other Info Files, , Referring to +Other Info Files}. Also, see @ref{Four and Five Arguments, , +@code{@@xref} with Four and Five Arguments}.)@refill + +Include files were designed primarily as a way to create a single, +large printed manual out of several smaller Info files. In a printed +manual, all the references were within the same document, so @TeX{} +could automatically determine the references' page numbers. The Info +formatting commands used include files only for creating joint +indices; each of the individual Texinfo files had to be formatted for +Info individually. (Each, therefore, required its own +@code{@@setfilename} line.)@refill + +However, because large Info files are now split automatically, it is +no longer necessary to keep them small.@refill + +Nowadays, multiple Texinfo files are used mostly for large documents, +such as @cite{The GNU Emacs Lisp Reference Manual}, and for projects +in which several different people write different sections of a +document simultaneously.@refill + +In addition, the Info formatting commands have been extended to work +with the @code{@@include} command so as to create a single large Info +file that is split into smaller files if necessary. This means that +you can write menus and cross references without naming the different +Texinfo files.@refill + + +@node Headings, Catching Mistakes, Include Files, Top +@appendix Page Headings +@cindex Headings +@cindex Footings +@cindex Page numbering +@cindex Page headings +@cindex Formatting headings and footings + +Most printed manuals contain headings along the top of every page +except the title and copyright pages. Some manuals also contain +footings. (Headings and footings have no meaning to Info, which is +not paginated.)@refill + +@menu +* Headings Introduced:: Conventions for using page headings. +* Heading Format:: Standard page heading formats. +* Heading Choice:: How to specify the type of page heading. +* Custom Headings:: How to create your own headings and footings. +@end menu + +@node Headings Introduced, Heading Format, Headings, Headings +@ifinfo +@heading Headings Introduced +@end ifinfo + +Texinfo provides standard page heading formats for manuals that are +printed on one side of each sheet of paper and for manuals that are +printed on both sides of the paper. Typically, you will use these +formats, but you can specify your own format if you wish.@refill + +In addition, you can specify whether chapters should begin on a new +page, or merely continue the same page as the previous chapter; and if +chapters begin on new pages, you can specify whether they must be +odd-numbered pages.@refill + +By convention, a book is printed on both sides of each sheet of paper. +When you open a book, the right-hand page is odd-numbered, and +chapters begin on right-hand pages---a preceding left-hand page is +left blank if necessary. Reports, however, are often printed on just +one side of paper, and chapters begin on a fresh page immediately +following the end of the preceding chapter. In short or informal +reports, chapters often do not begin on a new page at all, but are +separated from the preceding text by a small amount of whitespace.@refill + +The @code{@@setchapternewpage} command controls whether chapters begin +on new pages, and whether one of the standard heading formats is used. +In addition, Texinfo has several heading and footing commands that you +can use to generate your own heading and footing formats.@refill + +In Texinfo, headings and footings are single lines at the tops and +bottoms of pages; you cannot create multiline headings or footings. +Each header or footer line is divided into three parts: a left part, a +middle part, and a right part. Any part, or a whole line, may be left +blank. Text for the left part of a header or footer line is set +flushleft; text for the middle part is centered; and, text for the +right part is set flushright.@refill + +@node Heading Format, Heading Choice, Headings Introduced, Headings +@comment node-name, next, previous, up +@appendixsec Standard Heading Formats + +Texinfo provides two standard heading formats, one for manuals printed +on one side of each sheet of paper, and the other for manuals printed +on both sides of the paper. + +By default, nothing is specified for the footing of a Texinfo file, +so the footing remains blank.@refill + +The standard format for single-sided printing consists of a header +line in which the left-hand part contains the name of the chapter, the +central part is blank, and the right-hand part contains the page +number.@refill + +@need 950 +A single-sided page looks like this: + +@example +@group + _______________________ + | | + | chapter page number | + | | + | Start of text ... | + | ... | + | | + +@end group +@end example + +The standard format for two-sided printing depends on whether the page +number is even or odd. By convention, even-numbered pages are on the +left- and odd-numbered pages are on the right. (@TeX{} will adjust the +widths of the left- and right-hand margins. Usually, widths are +correct, but during double-sided printing, it is wise to check that +pages will bind properly---sometimes a printer will produce output in +which the even-numbered pages have a larger right-hand margin than the +odd-numbered pages.)@refill + +In the standard double-sided format, the left part of the left-hand +(even-numbered) page contains the page number, the central part is +blank, and the right part contains the title (specified by the +@code{@@settitle} command). The left part of the right-hand +(odd-numbered) page contains the name of the chapter, the central part +is blank, and the right part contains the page number.@refill + +@need 750 +Two pages, side by side as in an open book, look like this:@refill + +@example +@group + _______________________ _______________________ + | | | | + | page number title | | chapter page number | + | | | | + | Start of text ... | | More text ... | + | ... | | ... | + | | | | + +@end group +@end example + +@noindent +The chapter name is preceded by the word ``Chapter'', the chapter number +and a colon. This makes it easier to keep track of where you are in the +manual.@refill + +@node Heading Choice, Custom Headings, Heading Format, Headings +@comment node-name, next, previous, up +@appendixsec Specifying the Type of Heading + +@TeX{} does not begin to generate page headings for a standard Texinfo +file until it reaches the @code{@@end titlepage} command. Thus, the +title and copyright pages are not numbered. The @code{@@end +titlepage} command causes @TeX{} to begin to generate page headings +according to a standard format specified by the +@code{@@setchapternewpage} command that precedes the +@code{@@titlepage} section.@refill + +@need 1000 +There are four possibilities:@refill + +@table @asis +@item No @code{@@setchapternewpage} command +Cause @TeX{} to specify the single-sided heading format, with chapters +on new pages. This is the same as @code{@@setchapternewpage on}.@refill + +@item @code{@@setchapternewpage on} +Specify the single-sided heading format, with chapters on new pages.@refill + +@item @code{@@setchapternewpage off} +Cause @TeX{} to start a new chapter on the same page as the last page of +the preceding chapter, after skipping some vertical whitespace. Also +cause @TeX{} to typeset for single-sided printing. (You can override +the headers format with the @code{@@headings double} command; see +@ref{headings on off, , The @code{@@headings} Command}.)@refill + +@item @code{@@setchapternewpage odd} +Specify the double-sided heading format, with chapters on new pages.@refill +@end table + +@noindent +Texinfo lacks an @code{@@setchapternewpage even} command.@refill + +@node Custom Headings, , Heading Choice, Headings +@comment node-name, next, previous, up +@appendixsec How to Make Your Own Headings + +You can use the standard headings provided with Texinfo or specify +your own. By default, Texinfo has no footers, so if you specify them, +the available page size for the main text will be slightly reduced. + +@c Following paragraph is verbose to prevent overfull hboxes. +Texinfo provides six commands for specifying headings and +footings. The @code{@@everyheading} command and +@code{@@everyfooting} command generate page headers and footers +that are the same for both even- and odd-numbered pages. +The @code{@@evenheading} command and @code{@@evenfooting} +command generate headers and footers for even-numbered +(left-hand) pages; and the @code{@@oddheading} command and +@code{@@oddfooting} command generate headers and footers for +odd-numbered (right-hand) pages.@refill + +Write custom heading specifications in the Texinfo file immediately +after the @code{@@end titlepage} command. Enclose your specifications +between @code{@@iftex} and @code{@@end iftex} commands since the +@code{texinfo-format-buffer} command may not recognize them. Also, +you must cancel the predefined heading commands with the +@code{@@headings off} command before defining your own +specifications.@refill + +@need 1000 +Here is how to tell @TeX{} to place the chapter name at the left, the +page number in the center, and the date at the right of every header +for both even- and odd-numbered pages:@refill + +@example +@group +@@iftex +@@headings off +@@everyheading @@thischapter @@| @@thispage @@| @@today@{@} +@@end iftex +@end group +@end example + +@noindent +You need to divide the left part from the central part and the central +part from the right part by inserting @samp{@@|} between parts. +Otherwise, the specification command will not be able to tell where +the text for one part ends and the next part begins.@refill + +Each part can contain text or @@-commands. The text +is printed as if the part were within an ordinary paragraph in the +body of the page. The @@-commands replace +themselves with the page number, date, chapter name, or +whatever.@refill + +@need 950 +Here are the six heading and footing commands:@refill + +@findex everyheading +@findex everyfooting +@table @code +@item @@everyheading @var{left} @@| @var{center} @@| @var{right} +@itemx @@everyfooting @var{left} @@| @var{center} @@| @var{right} + +The `every' commands specify the format for both even- and odd-numbered +pages. These commands are for documents that are printed on one side +of each sheet of paper, or for documents in which you want symmetrical +headers or footers.@refill + +@findex evenheading +@findex evenfooting +@findex oddheading +@findex oddfooting +@item @@evenheading @var{left} @@| @var{center} @@| @var{right} +@itemx @@oddheading @var{left} @@| @var{center} @@| @var{right} + +@itemx @@evenfooting @var{left} @@| @var{center} @@| @var{right} +@itemx @@oddfooting @var{left} @@| @var{center} @@| @var{right} + +The `even' and `odd' commands specify the format for even-numbered +pages and odd-numbered pages. These commands are for books and +manuals that are printed on both sides of each sheet of paper. +@end table + +Use the @samp{@@this@dots{}} series of @@-commands to +provide the names of chapters +and sections and the page number. You can use the +@samp{@@this@dots{}} commands in the left, center, or right portions +of headers and footers, or anywhere else in a Texinfo file so long as +they are between @code{@@iftex} and @code{@@end iftex} commands.@refill + +@need 1000 +Here are the @samp{@@this@dots{}} commands:@refill + +@table @code +@findex thispage +@item @@thispage +Expands to the current page number.@refill +@c !!! Karl Berry says that `thissection' can fail on page breaks. +@ignore +@item @@thissection +Expands to the name of the current section.@refill +@end ignore + +@findex thischaptername +@item @@thischaptername +Expands to the name of the current chapter.@refill + +@findex thischapter +@item @@thischapter +Expands to the number and name of the current +chapter, in the format `Chapter 1: Title'.@refill + +@findex thistitle +@item @@thistitle +Expands to the name of the document, as specified by the +@code{@@settitle} command.@refill + +@findex thisfile +@item @@thisfile +For @code{@@include} files only: expands to the name of the current +@code{@@include} file. If the current Texinfo source file is not an +@code{@@include} file, this command has no effect. This command does +@emph{not} provide the name of the current Texinfo source file unless +it is an @code{@@include} file. (@xref{Include Files}, for more +information about @code{@@include} files.)@refill +@end table + +@noindent +You can also use the @code{@@today@{@}} command, which expands to the +current date, in `1 Jan 1900' format.@refill +@findex today + +Other @@-commands and text are printed in a header or footer just as +if they were in the body of a page. It is useful to incorporate text, +particularly when you are writing drafts:@refill + +@example +@group +@@iftex +@@headings off +@@everyheading @@emph@{Draft!@} @@| @@thispage @@| @@thischapter +@@everyfooting @@| @@| Version: 0.27: @@today@{@} +@@end iftex +@end group +@end example + +Beware of overlong titles: they may overlap another part of the +header or footer and blot it out.@refill + + +@node Catching Mistakes, Refilling Paragraphs, Headings, Top +@appendix Formatting Mistakes +@cindex Structure, catching mistakes in +@cindex Nodes, catching mistakes +@cindex Catching mistakes +@cindex Correcting mistakes +@cindex Mistakes, catching +@cindex Problems, catching +@cindex Debugging the Texinfo structure + +Besides mistakes in the content of your documentation, there +are two kinds of mistake you can make with Texinfo: you can make mistakes +with @@-commands, and you can make mistakes with the structure of the +nodes and chapters.@refill + +Emacs has two tools for catching the @@-command mistakes and two for +catching structuring mistakes.@refill + +For finding problems with @@-commands, you can run @TeX{} or a region +formatting command on the region that has a problem; indeed, you can +run these commands on each region as you write it.@refill + +For finding problems with the structure of nodes and chapters, you can use +@kbd{C-c C-s} (@code{texinfo-show-structure}) and the related @code{occur} +command and you can use the @kbd{M-x Info-validate} command.@refill + +@menu +* makeinfo Preferred:: @code{makeinfo} finds errors. +* Debugging with Info:: How to catch errors with Info formatting. +* Debugging with TeX:: How to catch errors with @TeX{} formatting. +* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}. +* Using occur:: How to list all lines containing a pattern. +* Running Info-Validate:: How to find badly referenced nodes. +@end menu + +@node makeinfo Preferred, Debugging with Info, Catching Mistakes, Catching Mistakes +@ifinfo +@heading @code{makeinfo} Find Errors +@end ifinfo + +The @code{makeinfo} program does an excellent job of catching errors +and reporting them---far better than @code{texinfo-format-region} or +@code{texinfo-format-buffer}. In addition, the various functions for +automatically creating and updating node pointers and menus remove +many opportunities for human error.@refill + +If you can, use the updating commands to create and insert pointers +and menus. These prevent many errors. Then use @code{makeinfo} (or +its Texinfo mode manifestations, @code{makeinfo-region} and +@code{makeinfo-buffer}) to format your file and check for other +errors. This is the best way to work with Texinfo. But if you +cannot use @code{makeinfo}, or your problem is very puzzling, then you +may want to use the tools described in this appendix.@refill + +@node Debugging with Info, Debugging with TeX, makeinfo Preferred, Catching Mistakes +@comment node-name, next, previous, up +@appendixsec Catching Errors with Info Formatting +@cindex Catching errors with Info formatting +@cindex Debugging with Info formatting + +After you have written part of a Texinfo file, you can use the +@code{texinfo-format-region} or the @code{makeinfo-region} command to +see whether the region formats properly.@refill + +Most likely, however, you are reading this section because for some +reason you cannot use the @code{makeinfo-region} command; therefore, the +rest of this section presumes that you are using +@code{texinfo-format-region}.@refill + +If you have made a mistake with an @@-command, +@code{texinfo-format-region} will stop processing at or after the +error and display an error message. To see where in the buffer the +error occurred, switch to the @samp{*Info Region*} buffer; the cursor +will be in a position that is after the location of the error. Also, +the text will not be formatted after the place where the error +occurred (or more precisely, where it was detected).@refill + +For example, if you accidentally end a menu with the command @code{@@end +menus} with an `s' on the end, instead of with @code{@@end menu}, you +will see an error message that says:@refill + +@example +@@end menus is not handled by texinfo +@end example + +@noindent +The cursor will stop at the point in the buffer where the error +occurs, or not long after it. The buffer will look like this:@refill + +@example +@group +---------- Buffer: *Info Region* ---------- +* Menu: + +* Using texinfo-show-structure:: How to use + `texinfo-show-structure' + to catch mistakes. +* Running Info-Validate:: How to check for + unreferenced nodes. +@@end menus +@point{} +---------- Buffer: *Info Region* ---------- +@end group +@end example + +The @code{texinfo-format-region} command sometimes provides slightly +odd error messages. For example, the following cross reference fails to format:@refill + +@example +(@@xref@{Catching Mistakes, for more info.) +@end example + +@noindent +In this case, @code{texinfo-format-region} detects the missing closing +brace but displays a message that says @samp{Unbalanced parentheses} +rather than @samp{Unbalanced braces}. This is because the formatting +command looks for mismatches between braces as if they were +parentheses.@refill + +Sometimes @code{texinfo-format-region} fails to detect mistakes. For +example, in the following, the closing brace is swapped with the +closing parenthesis:@refill + +@example +(@@xref@{Catching Mistakes), for more info.@} +@end example + +@noindent +Formatting produces: +@example +(*Note for more info.: Catching Mistakes) +@end example + +The only way for you to detect this error is to realize that the +reference should have looked like this:@refill + +@example +(*Note Catching Mistakes::, for more info.) +@end example + +Incidentally, if you are reading this node in Info and type @kbd{f +@key{RET}} (@code{Info-follow-reference}), you will generate an error +message that says: + +@example +No such node: "Catching Mistakes) The only way @dots{} +@end example + +@noindent +This is because Info perceives the example of the error as the first +cross reference in this node and if you type a @key{RET} immediately +after typing the Info @kbd{f} command, Info will attempt to go to the +referenced node. If you type @kbd{f catch @key{TAB} @key{RET}}, Info +will complete the node name of the correctly written example and take +you to the `Catching Mistakes' node. (If you try this, you can return +from the `Catching Mistakes' node by typing @kbd{l} +(@code{Info-last}).) + +@c !!! section on using Elisp debugger ignored. +@ignore +Sometimes @code{texinfo-format-region} will stop long after the +original error; this is because it does not discover the problem until +then. In this case, you will need to backtrack.@refill + +@c menu +@c * Using the Emacs Lisp Debugger:: How to use the Emacs Lisp debugger. +@c end menu + +@c node Using the Emacs Lisp Debugger +@c appendixsubsec Using the Emacs Lisp Debugger +@c index Using the Emacs Lisp debugger +@c index Emacs Lisp debugger +@c index Debugger, using the Emacs Lisp + +If an error is especially elusive, you can turn on the Emacs Lisp +debugger and look at the backtrace; this tells you where in the +@code{texinfo-format-region} function the problem occurred. You can +turn on the debugger with the command:@refill + +@example +M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET} +@end example + +@noindent +and turn it off with + +@example +M-x set-variable @key{RET} debug-on-error @key{RET} nil @key{RET} +@end example + +Often, when you are using the debugger, it is easier to follow what is +going on if you use the Emacs Lisp files that are not byte-compiled. +The byte-compiled sources send octal numbers to the debugger that may +look mysterious. To use the uncompiled source files, load +@file{texinfmt.el} and @file{texinfo.el} with the @kbd{M-x load-file} +command.@refill + +The debugger will not catch an error if @code{texinfo-format-region} +does not detect one. In the example shown above, +@code{texinfo-format-region} did not find the error when the whole +list was formatted, but only when part of the list was formatted. +When @code{texinfo-format-region} did not find an error, the debugger +did not find one either. @refill + +However, when @code{texinfo-format-region} did report an error, it +invoked the debugger. This is the backtrace it produced:@refill + +@example +---------- Buffer: *Backtrace* ---------- +Signalling: (search-failed "[@},]") + re-search-forward("[@},]") + (while ...) + (let ...) + texinfo-format-parse-args() + (let ...) + texinfo-format-xref() + funcall(texinfo-format-xref) + (if ...) + (let ...) + (if ...) + (while ...) + texinfo-format-scan() + (save-excursion ...) + (let ...) + texinfo-format-region(103370 103631) +* call-interactively(texinfo-format-region) +---------- Buffer: *Backtrace* ---------- +@end example + +The backtrace is read from the bottom up. +@code{texinfo-format-region} was called interactively; and it, in +turn, called various functions, including @code{texinfo-format-scan}, +@code{texinfo-format-xref} and @code{texinfo-format-parse-args}. +Inside the function @code{texinfo-format-parse-args}, the function +@code{re-search-forward} was called; it was this function that could +not find the missing right-hand brace.@refill + +@xref{Lisp Debug, , Debugging Emacs Lisp, emacs, The GNU Emacs +Manual}, for more information.@refill +@end ignore + +@node Debugging with TeX, Using texinfo-show-structure, Debugging with Info, Catching Mistakes +@comment node-name, next, previous, up +@appendixsec Catching Errors with @TeX{} Formatting +@cindex Catching errors with @TeX{} formatting +@cindex Debugging with @TeX{} formatting + +You can also catch mistakes when you format a file with @TeX{}.@refill + +Usually, you will want to do this after you have run +@code{texinfo-format-buffer} (or, better, @code{makeinfo-buffer}) on +the same file, because @code{texinfo-format-buffer} sometimes displays +error messages that make more sense than @TeX{}. (@xref{Debugging +with Info}, for more information.)@refill + +For example, @TeX{} was run on a Texinfo file, part of which is shown +here:@refill + +@example +---------- Buffer: texinfo.texi ---------- +name of the Texinfo file as an extension. The +@@samp@{??@} are `wildcards' that cause the shell to +substitute all the raw index files. (@@xref@{sorting +indices, for more information about sorting +indices.)@@refill +---------- Buffer: texinfo.texi ---------- +@end example + +@noindent +(The cross reference lacks a closing brace.) +@TeX{} produced the following output, after which it stopped:@refill + +@example +---------- Buffer: *tex-shell* ---------- +Runaway argument? +@{sorting indices, for more information about sorting +indices.) @@refill @@ETC. +! Paragraph ended before @@xref was complete. +<to be read again> + @@par +l.27 + +? +---------- Buffer: *tex-shell* ---------- +@end example + +In this case, @TeX{} produced an accurate and +understandable error message: + +@example +Paragraph ended before @@xref was complete. +@end example + +@noindent +@samp{@@par} is an internal @TeX{} command of no relevance to Texinfo. +@samp{l.27} means that @TeX{} detected the problem on line 27 of the +Texinfo file. The @samp{?} is the prompt @TeX{} uses in this +circumstance.@refill + +Unfortunately, @TeX{} is not always so helpful, and sometimes you must +truly be a Sherlock Holmes to discover what went wrong.@refill + +In any case, if you run into a problem like this, you can do one of three +things.@refill + +@enumerate +@item +You can tell @TeX{} to continue running and ignore just this error by +typing @key{RET} at the @samp{?} prompt.@refill + +@item +You can tell @TeX{} to continue running and to ignore all errors as best +it can by typing @kbd{r @key{RET}} at the @samp{?} prompt.@refill + +This is often the best thing to do. However, beware: the one error +may produce a cascade of additional error messages as its consequences +are felt through the rest of the file. To stop @TeX{} when it is +producing such an avalanche of error messages, type @kbd{C-c} (or +@kbd{C-c C-c}, if you are running a shell inside Emacs). + +@item +You can tell @TeX{} to stop this run by typing @kbd{x @key{RET}} +at the @samp{?} prompt.@refill +@end enumerate + +Please note that if you are running @TeX{} inside Emacs, you need to +switch to the shell buffer and line at which @TeX{} offers the @samp{?} +prompt.@refill + +Sometimes @TeX{} will format a file without producing error messages even +though there is a problem. This usually occurs if a command is not ended +but @TeX{} is able to continue processing anyhow. For example, if you fail +to end an itemized list with the @code{@@end itemize} command, @TeX{} will +write a DVI file that you can print out. The only error message that +@TeX{} will give you is the somewhat mysterious comment that@refill + +@example +(@@end occurred inside a group at level 1) +@end example + +@noindent +However, if you print the DVI file, you will find that the text +of the file that follows the itemized list is entirely indented as if +it were part of the last item in the itemized list. The error message +is the way @TeX{} says that it expected to find an @code{@@end} +command somewhere in the file; but that it could not determine where +it was needed.@refill + +Another source of notoriously hard-to-find errors is a missing +@code{@@end group} command. If you ever are stumped by +incomprehensible errors, look for a missing @code{@@end group} command +first.@refill + +If the Texinfo file lacks header lines, +@TeX{} may stop in the +beginning of its run and display output that looks like the following. +The @samp{*} indicates that @TeX{} is waiting for input.@refill + +@example +This is TeX, Version 3.14159 (Web2c 7.0) +(test.texinfo [1]) +* +@end example + +@noindent +In this case, simply type @kbd{\end @key{RET}} after the asterisk. Then +write the header lines in the Texinfo file and run the @TeX{} command +again. (Note the use of the backslash, @samp{\}. @TeX{} uses @samp{\} +instead of @samp{@@}; and in this circumstance, you are working +directly with @TeX{}, not with Texinfo.)@refill + +@node Using texinfo-show-structure, Using occur, Debugging with TeX, Catching Mistakes +@comment node-name, next, previous, up +@appendixsec Using @code{texinfo-show-structure} +@cindex Showing the structure of a file +@findex texinfo-show-structure + +It is not always easy to keep track of the nodes, chapters, sections, and +subsections of a Texinfo file. This is especially true if you are revising +or adding to a Texinfo file that someone else has written.@refill + +In GNU Emacs, in Texinfo mode, the @code{texinfo-show-structure} +command lists all the lines that begin with the @@-commands that +specify the structure: @code{@@chapter}, @code{@@section}, +@code{@@appendix}, and so on. With an argument (@w{@kbd{C-u}} +as prefix argument, if interactive), +the command also shows the @code{@@node} lines. The +@code{texinfo-show-structure} command is bound to @kbd{C-c C-s} in +Texinfo mode, by default.@refill + +The lines are displayed in a buffer called the @samp{*Occur*} buffer, +indented by hierarchical level. For example, here is a part of what was +produced by running @code{texinfo-show-structure} on this manual:@refill + +@example +@group + Lines matching "^@@\\(chapter \\|sect\\|subs\\|subh\\| + unnum\\|major\\|chapheading \\|heading \\|appendix\\)" + in buffer texinfo.texi. + @dots{} + 4177:@@chapter Nodes + 4198: @@heading Two Paths + 4231: @@section Node and Menu Illustration + 4337: @@section The @@code@{@@@@node@} Command + 4393: @@subheading Choosing Node and Pointer Names + 4417: @@subsection How to Write an @@code@{@@@@node@} Line + 4469: @@subsection @@code@{@@@@node@} Line Tips + @dots{} +@end group +@end example + +This says that lines 4337, 4393, and 4417 of @file{texinfo.texi} begin +with the @code{@@section}, @code{@@subheading}, and @code{@@subsection} +commands respectively. If you move your cursor into the @samp{*Occur*} +window, you can position the cursor over one of the lines and use the +@kbd{C-c C-c} command (@code{occur-mode-goto-occurrence}), to jump to +the corresponding spot in the Texinfo file. @xref{Other Repeating +Search, , Using Occur, emacs, The GNU Emacs Manual}, for more +information about @code{occur-mode-goto-occurrence}.@refill + +The first line in the @samp{*Occur*} window describes the @dfn{regular +expression} specified by @var{texinfo-heading-pattern}. This regular +expression is the pattern that @code{texinfo-show-structure} looks for. +@xref{Regexps, , Using Regular Expressions, emacs, The GNU Emacs Manual}, +for more information.@refill + +When you invoke the @code{texinfo-show-structure} command, Emacs will +display the structure of the whole buffer. If you want to see the +structure of just a part of the buffer, of one chapter, for example, +use the @kbd{C-x n n} (@code{narrow-to-region}) command to mark the +region. (@xref{Narrowing, , , emacs, The GNU Emacs Manual}.) This is +how the example used above was generated. (To see the whole buffer +again, use @kbd{C-x n w} (@code{widen}).)@refill + +If you call @code{texinfo-show-structure} with a prefix argument by +typing @w{@kbd{C-u C-c C-s}}, it will list lines beginning with +@code{@@node} as well as the lines beginning with the @@-sign commands +for @code{@@chapter}, @code{@@section}, and the like.@refill + +You can remind yourself of the structure of a Texinfo file by looking at +the list in the @samp{*Occur*} window; and if you have mis-named a node +or left out a section, you can correct the mistake.@refill + +@node Using occur, Running Info-Validate, Using texinfo-show-structure, Catching Mistakes +@comment node-name, next, previous, up +@appendixsec Using @code{occur} +@cindex Occurrences, listing with @code{@@occur} +@findex occur + +Sometimes the @code{texinfo-show-structure} command produces too much +information. Perhaps you want to remind yourself of the overall structure +of a Texinfo file, and are overwhelmed by the detailed list produced by +@code{texinfo-show-structure}. In this case, you can use the @code{occur} +command directly. To do this, type@refill + +@example +@kbd{M-x occur} +@end example + +@noindent +and then, when prompted, type a @dfn{regexp}, a regular expression for +the pattern you want to match. (@xref{Regexps, , Regular Expressions, +emacs, The GNU Emacs Manual}.) The @code{occur} command works from +the current location of the cursor in the buffer to the end of the +buffer. If you want to run @code{occur} on the whole buffer, place +the cursor at the beginning of the buffer.@refill + +For example, to see all the lines that contain the word +@samp{@@chapter} in them, just type @samp{@@chapter}. This will +produce a list of the chapters. It will also list all the sentences +with @samp{@@chapter} in the middle of the line.@refill + +If you want to see only those lines that start with the word +@samp{@@chapter}, type @samp{^@@chapter} when prompted by +@code{occur}. If you want to see all the lines that end with a word +or phrase, end the last word with a @samp{$}; for example, +@samp{catching mistakes$}. This can be helpful when you want to see +all the nodes that are part of the same chapter or section and +therefore have the same `Up' pointer.@refill + +@xref{Other Repeating Search, , Using Occur, emacs , The GNU Emacs Manual}, +for more information.@refill + +@node Running Info-Validate, , Using occur, Catching Mistakes +@comment node-name, next, previous, up +@appendixsec Finding Badly Referenced Nodes +@findex Info-validate +@cindex Nodes, checking for badly referenced +@cindex Checking for badly referenced nodes +@cindex Looking for badly referenced nodes +@cindex Finding badly referenced nodes +@cindex Badly referenced nodes + +You can use the @code{Info-validate} command to check whether any of +the `Next', `Previous', `Up' or other node pointers fail to point to a +node. This command checks that every node pointer points to an +existing node. The @code{Info-validate} command works only on Info +files, not on Texinfo files.@refill + +The @code{makeinfo} program validates pointers automatically, so you +do not need to use the @code{Info-validate} command if you are using +@code{makeinfo}. You only may need to use @code{Info-validate} if you +are unable to run @code{makeinfo} and instead must create an Info file +using @code{texinfo-format-region} or @code{texinfo-format-buffer}, or +if you write an Info file from scratch.@refill + +@menu +* Using Info-validate:: How to run @code{Info-validate}. +* Unsplit:: How to create an unsplit file. +* Tagifying:: How to tagify a file. +* Splitting:: How to split a file manually. +@end menu + +@node Using Info-validate, Unsplit, Running Info-Validate, Running Info-Validate +@appendixsubsec Running @code{Info-validate} +@cindex Running @code{Info-validate} +@cindex Info validating a large file +@cindex Validating a large file + +To use @code{Info-validate}, visit the Info file you wish to check and +type:@refill + +@example +M-x Info-validate +@end example + +@noindent +(Note that the @code{Info-validate} command requires an upper case +`I'. You may also need to create a tag table before running +@code{Info-validate}. @xref{Tagifying}.)@refill + +If your file is valid, you will receive a message that says ``File appears +valid''. However, if you have a pointer that does not point to a node, +error messages will be displayed in a buffer called @samp{*problems in +info file*}.@refill + +For example, @code{Info-validate} was run on a test file that contained +only the first node of this manual. One of the messages said:@refill + +@example +In node "Overview", invalid Next: Texinfo Mode +@end example + +@noindent +This meant that the node called @samp{Overview} had a `Next' pointer that +did not point to anything (which was true in this case, since the test file +had only one node in it).@refill + +Now suppose we add a node named @samp{Texinfo Mode} to our test case +but we do not specify a `Previous' for this node. Then we will get +the following error message:@refill + +@example +In node "Texinfo Mode", should have Previous: Overview +@end example + +@noindent +This is because every `Next' pointer should be matched by a +`Previous' (in the node where the `Next' points) which points back.@refill + +@code{Info-validate} also checks that all menu entries and cross references +point to actual nodes.@refill + +Note that @code{Info-validate} requires a tag table and does not work +with files that have been split. (The @code{texinfo-format-buffer} +command automatically splits large files.) In order to use +@code{Info-validate} on a large file, you must run +@code{texinfo-format-buffer} with an argument so that it does not split +the Info file; and you must create a tag table for the unsplit +file.@refill + +@node Unsplit, Tagifying, Using Info-validate, Running Info-Validate +@comment node-name, next, previous, up +@appendixsubsec Creating an Unsplit File +@cindex Creating an unsplit file +@cindex Unsplit file creation + +You can run @code{Info-validate} only on a single Info file that has a +tag table. The command will not work on the indirect subfiles that +are generated when a master file is split. If you have a large file +(longer than 70,000 bytes or so), you need to run the +@code{texinfo-format-buffer} or @code{makeinfo-buffer} command in such +a way that it does not create indirect subfiles. You will also need +to create a tag table for the Info file. After you have done this, +you can run @code{Info-validate} and look for badly referenced +nodes.@refill + +The first step is to create an unsplit Info file. To prevent +@code{texinfo-format-buffer} from splitting a Texinfo file into +smaller Info files, give a prefix to the @kbd{M-x +texinfo-format-buffer} command:@refill + +@example +C-u M-x texinfo-format-buffer +@end example + +@noindent +or else + +@example +C-u C-c C-e C-b +@end example + +@noindent +When you do this, Texinfo will not split the file and will not create +a tag table for it. @refill +@cindex Making a tag table manually +@cindex Tag table, making manually + +@node Tagifying, Splitting, Unsplit, Running Info-Validate +@appendixsubsec Tagifying a File + +After creating an unsplit Info file, you must create a tag table for +it. Visit the Info file you wish to tagify and type:@refill + +@example +M-x Info-tagify +@end example + +@noindent +(Note the upper case @samp{I} in @code{Info-tagify}.) This creates an +Info file with a tag table that you can validate.@refill + +The third step is to validate the Info file:@refill + +@example +M-x Info-validate +@end example + +@noindent +(Note the upper case @samp{I} in @code{Info-validate}.) +In brief, the steps are:@refill + +@example +@group +C-u M-x texinfo-format-buffer +M-x Info-tagify +M-x Info-validate +@end group +@end example + +After you have validated the node structure, you can rerun +@code{texinfo-format-buffer} in the normal way so it will construct a +tag table and split the file automatically, or you can make the tag +table and split the file manually.@refill + +@node Splitting, , Tagifying, Running Info-Validate +@comment node-name, next, previous, up +@appendixsubsec Splitting a File Manually +@cindex Splitting an Info file manually +@cindex Info file, splitting manually + +You should split a large file or else let the +@code{texinfo-format-buffer} or @code{makeinfo-buffer} command do it +for you automatically. (Generally you will let one of the formatting +commands do this job for you. @xref{Create an Info File}.)@refill + +The split-off files are called the indirect subfiles.@refill + +Info files are split to save memory. With smaller files, Emacs does not +have make such a large buffer to hold the information.@refill + +If an Info file has more than 30 nodes, you should also make a tag +table for it. @xref{Using Info-validate}, for information +about creating a tag table. (Again, tag tables are usually created +automatically by the formatting command; you only need to create a tag +table yourself if you are doing the job manually. Most likely, you +will do this for a large, unsplit file on which you have run +@code{Info-validate}.)@refill + +@c Info-split is autoloaded in `loaddefs.el' in Emacs 18.51 +@ignore +Before running @code{Info-split}, you need to load the @code{info} library +into Emacs by giving the command @kbd{M-x load-library @key{RET} info +@key{RET}}. +@end ignore + +Visit the Info file you wish to tagify and split and type the two +commands:@refill + +@example +M-x Info-tagify +M-x Info-split +@end example + +@noindent +(Note that the @samp{I} in @samp{Info} is upper case.)@refill + +When you use the @code{Info-split} command, the buffer is modified into a +(small) Info file which lists the indirect subfiles. This file should be +saved in place of the original visited file. The indirect subfiles are +written in the same directory the original file is in, with names generated +by appending @samp{-} and a number to the original file name.@refill + +The primary file still functions as an Info file, but it contains just +the tag table and a directory of subfiles.@refill + + +@node Refilling Paragraphs, Command Syntax, Catching Mistakes, Top +@appendix Refilling Paragraphs +@cindex Refilling paragraphs +@cindex Filling paragraphs +@findex refill + +The @code{@@refill} command refills and, optionally, indents the first +line of a paragraph.@footnote{Perhaps the command should have been +called the @code{@@refillandindent} command, but @code{@@refill} is +shorter and the name was chosen before indenting was possible.} The +@code{@@refill} command is no longer important, but we describe it here +because you once needed it. You will see it in many old Texinfo +files.@refill + +Without refilling, paragraphs containing long @@-constructs may look +bad after formatting because the formatter removes @@-commands and +shortens some lines more than others. In the past, neither the +@code{texinfo-format-region} command nor the +@code{texinfo-format-buffer} command refilled paragraphs +automatically. The @code{@@refill} command had to be written at the +end of every paragraph to cause these formatters to fill them. (Both +@TeX{} and @code{makeinfo} have always refilled paragraphs +automatically.) Now, all the Info formatters automatically fill and +indent those paragraphs that need to be filled and indented.@refill + +The @code{@@refill} command causes @code{texinfo-format-region} and +@code{texinfo-format-buffer} to refill a paragraph in the Info file +@emph{after} all the other processing has been done. For this reason, +you can not use @code{@@refill} with a paragraph containing either +@code{@@*} or @code{@@w@{ @dots{} @}} since the refilling action will +override those two commands.@refill + +The @code{texinfo-format-region} and @code{texinfo-format-buffer} +commands now automatically append @code{@@refill} to the end of each +paragraph that should be filled. They do not append @code{@@refill} to +the ends of paragraphs that contain @code{@@*} or @w{@code{@@w@{ @dots{}@}}} +and therefore do not refill or indent them.@refill + + +@node Command Syntax, Obtaining TeX, Refilling Paragraphs, Top +@comment node-name, next, previous, up +@appendix @@-Command Syntax +@cindex @@-command syntax + +The character @samp{@@} is used to start special Texinfo commands. +(It has the same meaning that @samp{\} has in plain @TeX{}.) Texinfo +has four types of @@-command:@refill + +@table @asis +@item 1. Non-alphabetic commands. +These commands consist of an @@ followed by a punctuation mark or other +character that is not part of the alphabet. Non-alphabetic commands are +almost always part of the text within a paragraph, and never take any +argument. The two characters (@@ and the other one) are complete in +themselves; none is followed by braces. The non-alphabetic commands +are: @code{@@.}, @code{@@:}, @code{@@*}, @code{@@@kbd{SPACE}}, +@code{@@@kbd{TAB}}, @code{@@@kbd{NL}}, @code{@@@@}, @code{@@@{}, and +@code{@@@}}.@refill + +@item 2. Alphabetic commands that do not require arguments. +These commands start with @@ followed by a word followed by left- and +right-hand braces. These commands insert special symbols in the +document; they do not require arguments. For example, +@code{@@dots@{@}} @result{} @samp{@dots{}}, @code{@@equiv@{@}} +@result{} @samp{@equiv{}}, @code{@@TeX@{@}} @result{} `@TeX{}', +and @code{@@bullet@{@}} @result{} @samp{@bullet{}}.@refill + +@item 3. Alphabetic commands that require arguments within braces. +These commands start with @@ followed by a letter or a word, followed by an +argument within braces. For example, the command @code{@@dfn} indicates +the introductory or defining use of a term; it is used as follows: @samp{In +Texinfo, @@@@-commands are @@dfn@{mark-up@} commands.}@refill + +@item 4. Alphabetic commands that occupy an entire line. +These commands occupy an entire line. The line starts with @@, +followed by the name of the command (a word); for example, @code{@@center} +or @code{@@cindex}. If no argument is needed, the word is followed by +the end of the line. If there is an argument, it is separated from +the command name by a space. Braces are not used.@refill +@end table + +@cindex Braces and argument syntax +Thus, the alphabetic commands fall into classes that have +different argument syntaxes. You cannot tell to which class a command +belongs by the appearance of its name, but you can tell by the +command's meaning: if the command stands for a glyph, it is in +class 2 and does not require an argument; if it makes sense to use the +command together with other text as part of a paragraph, the command +is in class 3 and must be followed by an argument in braces; +otherwise, it is in class 4 and uses the rest of the line as its +argument.@refill + +The purpose of having a different syntax for commands of classes 3 and +4 is to make Texinfo files easier to read, and also to help the GNU +Emacs paragraph and filling commands work properly. There is only one +exception to this rule: the command @code{@@refill}, which is always +used at the end of a paragraph immediately following the final period +or other punctuation character. @code{@@refill} takes no argument and +does @emph{not} require braces. @code{@@refill} never confuses the +Emacs paragraph commands because it cannot appear at the beginning of +a line.@refill + + +@node Obtaining TeX, Command and Variable Index, Command Syntax, Top +@appendix How to Obtain @TeX{} +@cindex Obtaining @TeX{} +@cindex @TeX{}, how to obtain + +@c !!! Here is information about obtaining TeX. Update it whenever. +@c !!! Also consider updating TeX.README on prep. +@c Updated by RJC on 1 March 1995, conversation with MacKay. +@c Updated by kb@cs.umb.edu on 29 July 1996. +@c Updated by kb@cs.umb.edu on 25 April 1997. +@TeX{} is freely redistributable. You can obtain @TeX{} for Unix +systems via anonymous ftp or on physical media. The core material +consists of the Web2c @TeX{} distribution (@uref{http://www.tug.org/web2c}). + +Instructions for retrieval by anonymous ftp and information on other +available distributions: +@example +@uref{ftp://ftp.tug.org/tex/unixtex.ftp} +@uref{http://www.tug.org/unixtex.ftp} +@end example + +The Free Software Foundation provides a core distribution on its Source +Code CD-ROM suitable for printing Texinfo manuals; the University of +Washington maintains and supports a tape distribution; the @TeX{} Users +Group co-sponsors a complete CD-ROM @TeX{} distribution. + +@itemize @bullet + +@item +For the FSF Source Code CD-ROM, please contact: + +@iftex +@display +@group +Free Software Foundation, Inc. +59 Temple Place Suite 330 +Boston, MA @ @ 02111-1307 +USA +Telephone: @w{@t{+}1--617--542--5942} +Fax: (including Japan) @w{@t{+}1--617--542--2652} +Free Dial Fax (in Japan): +@w{ } @w{ } @w{ } 0031--13--2473 (KDD) +@w{ } @w{ } @w{ } 0066--3382--0158 (IDC) +Electronic mail: @code{gnu@@prep.ai.mit.edu} +@end group +@end display +@end iftex +@ifinfo +@display +@group +Free Software Foundation, Inc. +59 Temple Place Suite 330 +Boston, MA @w{ } 02111-1307 +USA + +Telephone: @w{@t{+}1-617-542-5942} +Fax: (including Japan) @w{@t{+}1-617-542-2652} +Free Dial Fax (in Japan): +@w{ } @w{ } @w{ } 0031-13-2473 (KDD) +@w{ } @w{ } @w{ } 0066-3382-0158 (IDC) +Electronic mail: @code{gnu@@prep.ai.mit.edu} +@end group +@end display +@end ifinfo + +@item +To order a complete distribution on CD-ROM, please see +@uref{http://www.tug.org/tex-live.html}. (This distribution is also +available by FTP; see the URL's above.) + +@item +To order a full distribution from the University of Washington on either +a 1/4@dmn{in} 4-track QIC-24 cartridge or a 4@dmn{mm} DAT cartridge, +send $210 to: + +@display +@group +Pierre A. MacKay +Denny Hall, Mail Stop DH-10 +University of Washington +Seattle, WA @w{ } 98195 +USA +Telephone: @t{+}1--206--543--2268 +Electronic mail: @code{mackay@@cs.washington.edu} +@end group +@end display + +@noindent Please make checks payable to the University of Washington. +Checks must be in U.S.@: dollars, drawn on a U.S.@: bank. Overseas +sites: please add to the base cost, if desired, $20.00 for shipment via +air parcel post, or $30.00 for shipment via courier. + +@end itemize + +Many other @TeX{} distributions are available; see +@uref{http://www.tug.org/}. + + +@c These are no longer ``new'', and the explanations +@c are all given elsewhere anyway, I think. --karl, 25apr97. +@ignore (the entire appendix) +@c node New Features, Command and Variable Index, Obtaining TeX, Top +@c appendix Second Edition Features + +@tex +% Widen the space for the first column so three control-character +% strings fit in the first column. Switched back to default .8in +% value at end of chapter. +\global\tableindent=1.0in +@end tex + +The second edition of the Texinfo manual describes more than 20 new +Texinfo mode commands and more than 50 previously undocumented Texinfo +@@-commands. This edition is more than twice the length of the first +edition.@refill + +Here is a brief description of the new commands.@refill + +@menu +* New Texinfo Mode Commands:: The updating commands are especially useful. +* New Commands:: Many newly described @@-commands. +@end menu + +@c node New Texinfo Mode Commands, New Commands, Obtaining TeX, Obtaining TeX +@c appendixsec New Texinfo Mode Commands + +Texinfo mode provides commands and features especially designed for +working with Texinfo files. More than 20 new commands have been +added, including commands for automatically creating and updating +both nodes and menus. This is a tedious task when done by hand.@refill + +The keybindings are intended to be somewhat mnemonic.@refill + +@c subheading Update all nodes and menus + +The @code{texinfo-master-menu} command is the primary command: + +@table @kbd +@item C-c C-u m +@itemx M-x texinfo-master-menu +Create or update a master menu. +With @kbd{C-u} as a prefix argument, +first create or update all nodes +and regular menus. +@end table + +@c subheading Update Pointers + +@noindent +Create or update `Next', `Previous', and `Up' node pointers.@refill + +@noindent +@xref{Updating Nodes and Menus}. + +@table @kbd +@item C-c C-u C-n +@itemx M-x texinfo-update-node +Update a node. + +@item C-c C-u C-e +@itemx M-x texinfo-every-node-update +Update every node in the buffer. +@end table + +@c subheading Update Menus + +@noindent +Create or update menus.@refill + +@noindent +@xref{Updating Nodes and Menus}. + +@table @kbd +@item C-c C-u C-m +@itemx M-x texinfo-make-menu +Make or update a menu. + +@item C-c C-u C-a +@itemx M-x texinfo-all-menus-update +Make or update all the menus in a buffer. +With @kbd{C-u} as a prefix argument, +first update all the nodes. +@end table + +@c subheading Insert Title as Description + +@noindent +Insert a node's chapter or section title in the space for the +description in a menu entry line; position point so you can edit the +insert. (This command works somewhat differently than the other +insertion commands, which insert only a predefined string.)@refill + +@noindent +@xref{Inserting, Inserting Frequently Used Commands}. + +@table @kbd +@item C-c C-c C-d +Insert title. +@end table + +@c subheading Format for Info + +@noindent +Provide keybindings both for the Info formatting commands that are +written in Emacs Lisp and for @code{makeinfo} that is written in +C.@refill + +@noindent +@xref{Info Formatting}. + +@noindent +Use the Emacs lisp @code{texinfo-format@dots{}} commands: + +@table @kbd +@item C-c C-e C-r +Format the region. + +@item C-c C-e C-b +Format the buffer. +@end table + +@noindent +Use @code{makeinfo}: + +@table @kbd +@item C-c C-m C-r +Format the region. + +@item C-c C-m C-b +Format the buffer. + +@item C-c C-m C-l +Recenter the @code{makeinfo} output buffer. + +@item C-c C-m C-k +Kill the @code{makeinfo} formatting job. +@end table + +@c subheading Typeset and Print + +@noindent +Typeset and print Texinfo documents from within Emacs.@refill + +@ifinfo +@noindent +@xref{Printing}. +@end ifinfo +@iftex +@noindent +@xref{Printing, , Formatting and Printing}. +@end iftex + +@table @kbd +@item C-c C-t C-b +Run @code{texi2dvi} on the buffer. + +@item C-c C-t C-r +Run @TeX{} on the region. + +@item C-c C-t C-i +Run @code{texindex}. + +@item C-c C-t C-p +Print the DVI file. + +@item C-c C-t C-q +Show the print queue. + +@item C-c C-t C-d +Delete a job from the print queue. + +@item C-c C-t C-k +Kill the current @TeX{} formatting job. + +@item C-c C-t C-x +Quit a currently stopped @TeX{} formatting job. + +@item C-c C-t C-l +Recenter the output buffer. +@end table + +@c subheading Other Updating Commands + +@noindent +The ``other updating commands'' do not have standard keybindings because +they are used less frequently.@refill + +@noindent +@xref{Other Updating Commands}. + +@table @kbd +@item M-x texinfo-insert-node-lines +Insert missing @code{@@node} lines using +section titles as node names. + +@item M-x texinfo-multiple-files-update +Update a multi-file document. +With a numeric prefix, such as @kbd{C-u 8}, +update @strong{every} pointer and +menu in @strong{all} the files and +then insert a master menu. + +@item M-x texinfo-indent-menu-description +Indent descriptions in menus. + +@item M-x texinfo-sequential-node-update +Insert node pointers in strict sequence. +@end table + +@c node New Commands, , New Texinfo Mode Commands, Obtaining TeX +@c appendixsec New Texinfo @@-Commands + +The second edition of the Texinfo manual describes more than 50 +commands that were not described in the first edition. A third or so +of these commands existed in Texinfo but were not documented in the +manual; the others are new. Here is a listing, with brief +descriptions of them:@refill + +@c subheading Indexing + +@noindent +Create your own index, and merge indices.@refill + +@noindent +@xref{Indices}. + +@table @kbd +@item @@defindex @var{index-name} +Define a new index and its indexing command. +See also the @code{@@defcodeindex} command. + +@c written verbosely to avoid overfull hbox +@item @@synindex @var{from-index} @var{into-index} +Merge the @var{from-index} index into the @var{into-index} index. +See also the @code{@@syncodeindex} command. +@end table + +@c subheading Definitions + +@noindent +Describe functions, variables, macros, +commands, user options, special forms, and other such artifacts in a +uniform format.@refill + +@noindent +@xref{Definition Commands}. + +@table @kbd +@item @@deffn @var{category} @var{name} @var{arguments}@dots{} +Format a description for functions, interactive +commands, and similar entities. + +@item @@defvr, @@defop, @dots{} +15 other related commands. +@end table + +@c subheading Glyphs + +@noindent +Indicate the results of evaluation, expansion, +printed output, an error message, equivalence of expressions, and the +location of point.@refill + +@noindent +@xref{Glyphs}. + +@table @kbd +@item @@equiv@{@} +@itemx @equiv{} +Equivalence: + +@item @@error@{@} +@itemx @error{} +Error message + +@item @@expansion@{@} +@itemx @expansion{} +Macro expansion + +@item @@point@{@} +@itemx @point{} +Position of point + +@item @@print@{@} +@itemx @print{} +Printed output + +@item @@result@{@} +@itemx @result{} +Result of an expression +@end table + +@c subheading Page Headings + +@noindent +Customize page headings. + +@noindent +@xref{Headings}. + +@table @kbd +@item @@headings @var{on-off-single-double} +Headings on or off, single, or double-sided. + +@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] +Footings for even-numbered (left-hand) pages. + +@item @@evenheading, @@everyheading, @@oddheading, @dots{} +Five other related commands. + +@item @@thischapter +Insert name of chapter and chapter number. + +@item @@thischaptername, @@thisfile, @@thistitle, @@thispage +Related commands. +@end table + +@c subheading Formatting + +@noindent +Format blocks of text. + +@noindent +@xref{Quotations and Examples}, and@* +@ref{Lists and Tables, , Making Lists and Tables}. + +@table @kbd +@item @@cartouche +Draw rounded box surrounding text (not in Info). + +@item @@enumerate @var{optional-arg} +Enumerate a list with letters or numbers. + +@item @@exdent @var{line-of-text} +Remove indentation. + +@item @@flushleft +Left justify. + +@item @@flushright +Right justify. + +@item @@format +Do not narrow nor change font. + +@item @@ftable @var{formatting-command} +@itemx @@vtable @var{formatting-command} +Two-column table with indexing. + +@item @@lisp +For an example of Lisp code. + +@item @@smallexample +@itemx @@smalllisp +Like @@table and @@lisp @r{but for} @@smallbook. +@end table + +@c subheading Conditionals + +@noindent +Conditionally format text. + +@noindent +@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill + +@table @kbd +@item @@set @var{flag} [@var{string}] +Set a flag. Optionally, set value +of @var{flag} to @var{string}. + +@item @@clear @var{flag} +Clear a flag. + +@item @@value@{@var{flag}@} +Replace with value to which @var{flag} is set. + +@item @@ifset @var{flag} +Format, if @var{flag} is set. + +@item @@ifclear @var{flag} +Ignore, if @var{flag} is set. +@end table + +@c subheading @@heading series for Titles + +@noindent +Produce unnumbered headings that do not appear in a table of contents. + +@noindent +@xref{Structuring}. + +@table @kbd +@item @@heading @var{title} +Unnumbered section-like heading not listed +in the table of contents of a printed manual. + +@item @@chapheading, @@majorheading, @@c subheading, @@subsubheading +Related commands. +@end table + +@need 1000 +@c subheading Font commands + +@need 1000 +@noindent +@xref{Smallcaps}, and @* +@ref{Fonts}. + +@table @kbd +@item @@r@{@var{text}@} +Print in roman font. + +@item @@sc@{@var{text}@} +Print in @sc{small caps} font. +@end table + +@c subheading Miscellaneous + +@noindent +See @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author} Commands},@* +see @ref{Customized Highlighting},@* +see @ref{Overfull hboxes},@* +see @ref{Footnotes},@* +see @ref{dmn, , Format a Dimension},@* +see @ref{Raise/lower sections, , @code{@@raisesections} and @code{@@lowersections}},@* +see @ref{math, , @code{@@math}: Inserting Mathematical Expressions}.@* +see @ref{minus, , Inserting a Minus Sign},@* +see @ref{paragraphindent, , Paragraph Indenting},@* +see @ref{Cross Reference Commands},@* +see @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author}}, and@* +see @ref{Custom Headings, , How to Make Your Own Headings}. + +@table @kbd +@item @@author @var{author} +Typeset author's name. + +@c @item @@definfoenclose @var{new-command}, @var{before}, @var{after}, +@c Define a highlighting command for Info. (Info only.) + +@item @@finalout +Produce cleaner printed output. + +@item @@footnotestyle @var{end-or-separate} +Specify footnote style. + +@item @@dmn@{@var{dimension}@} +Format a dimension. + +@item @@global@@let@var{new-cmd}=@var{existing-cmd} +Define a highlighting command for @TeX{}. (@TeX{} only.) + +@item @@lowersections +Reduce hierarchical level of sectioning commands. + +@item @@math@{@var{mathematical-expression}@} +Format a mathematical expression. + +@item @@minus@{@} +Generate a minus sign. + +@item @@paragraphindent @var{asis-or-number} +Specify paragraph indentation. + +@item @@raisesections +Raise hierarchical level of sectioning commands. + +@item @@ref@{@var{node-name}, @r{[}@var{entry}@r{]}, @r{[}@var{topic-or-title}@r{]}, @r{[}@var{info-file}@r{]}, @r{[}@var{manual}@r{]}@} +Make a reference. In the printed manual, the +reference does not start with the word `see'. + +@item @@title @var{title} +Typeset @var{title} in the alternative +title page format. + +@item @@subtitle @var{subtitle} +Typeset @var{subtitle} in the alternative +title page format. + +@item @@today@{@} +Insert the current date. +@end table +@tex +% Switch width of first column of tables back to default value +\global\tableindent=.8in +@end tex +@end ignore + +@node Command and Variable Index, Concept Index, Obtaining TeX, Top +@comment node-name, next, previous, up +@unnumbered Command and Variable Index + +This is an alphabetical list of all the @@-commands, assorted Emacs Lisp +functions, and several variables. To make the list easier to use, the +commands are listed without their preceding @samp{@@}.@refill + +@printindex fn + + +@node Concept Index, , Command and Variable Index, Top +@unnumbered Concept Index + +@printindex cp + + +@summarycontents +@contents +@bye diff --git a/gnu/usr.bin/texinfo/doc/userdoc.texi b/gnu/usr.bin/texinfo/doc/userdoc.texi new file mode 100644 index 00000000000..cee6b084efa --- /dev/null +++ b/gnu/usr.bin/texinfo/doc/userdoc.texi @@ -0,0 +1,1270 @@ +@c This file is meant to be included in any arbitrary piece of +@c documentation that wishes to describe the info program. Some day +@c info-stnd.texi should probably use this file instead of duplicating +@c its contents. +@c +@c This file documents the use of the standalone GNU Info program, +@c versions 2.7 and later. + +@ifclear InfoProgVer +@set InfoProgVer 2.11 +@end ifclear +@synindex vr cp +@synindex fn cp +@synindex ky cp + +@heading What is Info? + +This text documents the use of the GNU Info program, version +@value{InfoProgVer}. + +@dfn{Info} is a program which is used to view info files on an ASCII +terminal. @dfn{info files} are the result of processing texinfo files +with the program @code{makeinfo} or with the Emacs command @code{M-x +texinfo-format-buffer}. Finally, @dfn{texinfo} is a documentation +language which allows a printed manual and online documentation (an info +file) to be produced from a single source file. + +@menu +* Options:: Options you can pass on the command line. +* Cursor Commands:: Commands which move the cursor within a node. +* Scrolling Commands:: Commands for moving the node around in a window. +* Node Commands:: Commands for selecting a new node. +* Searching Commands:: Commands for searching an info file. +* Xref Commands:: Commands for selecting cross references. +* Window Commands:: Commands which manipulate multiple windows. +* Printing Nodes:: How to print out the contents of a node. +* Miscellaneous Commands:: A few commands that defy categories. +* Variables:: How to change the default behaviour of Info. +@ifset NOTSET +* Info for Sys Admins:: How to setup Info. Using special options. +@end ifset +@ifset STANDALONE +* GNU Info Global Index:: Global index containing keystrokes, command names, + variable names, and general concepts. +@end ifset +@end menu + +@node Options +@chapter Command Line Options +@cindex command line options +@cindex arguments, command line + +GNU Info accepts several options to control the initial node being +viewed, and to specify which directories to search for info files. Here +is a template showing an invocation of GNU Info from the shell: + +@example +info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{} +@end example + +The following @var{option-names} are available when invoking Info from +the shell: + +@table @code +@cindex directory path +@item --directory @var{directory-path} +@itemx -d @var{directory-path} +Adds @var{directory-path} to the list of directory paths searched when +Info needs to find a file. You may issue @code{--directory} multiple +times; once for each directory which contains info files. +Alternatively, you may specify a value for the environment variable +@code{INFOPATH}; if @code{--directory} is not given, the value of +@code{INFOPATH} is used. The value of @code{INFOPATH} is a colon +separated list of directory names. If you do not supply +@code{INFOPATH} or @code{--directory-path} a default path is used. + +@item --file @var{filename} +@itemx -f @var{filename} +@cindex info file, selecting +Specifies a particular info file to visit. Instead of visiting the file +@code{dir}, Info will start with @code{(@var{filename})Top} as the first +file and node. + +@item --node @var{nodename} +@itemx -n @var{nodename} +@cindex node, selecting +Specifies a particular node to visit in the initial file loaded. This +is especially useful in conjunction with @code{--file}@footnote{Of +course, you can specify both the file and node in a @code{--node} +command; but don't forget to escape the open and close parentheses from +the shell as in: @code{info --node '(emacs)Buffers'}}. You may specify +@code{--node} multiple times; for an interactive Info, each +@var{nodename} is visited in its own window, for a non-interactive Info +(such as when @code{--output} is given) each @var{nodename} is processed +sequentially. + +@item --output @var{filename} +@itemx -o @var{filename} +@cindex file, outputting to +@cindex outputting to a file +Specify @var{filename} as the name of a file to output to. Each node +that Info visits will be output to @var{filename} instead of +interactively viewed. A value of @code{-} for @var{filename} specifies +the standard output. + +@item --subnodes +@cindex @code{--subnodes}, command line option +This option only has meaning when given in conjunction with +@code{--output}. It means to recursively output the nodes appearing in +the menus of each node being output. Menu items which resolve to +external info files are not output, and neither are menu items which are +members of an index. Each node is only output once. + +@item --help +@itemx -h +Produces a relatively brief description of the available Info options. + +@item --version +@cindex version information +Prints the version information of Info and exits. + +@item @var{menu-item} +@cindex menu, following +Remaining arguments to Info are treated as the names of menu items. The +first argument would be a menu item in the initial node visited, while +the second argument would be a menu item in the first argument's node. +You can easily move to the node of your choice by specifying the menu +names which describe the path to that node. For example, + +@example +info emacs buffers +@end example + +first selects the menu item @samp{Emacs} in the node @samp{(dir)Top}, +and then selects the menu item @samp{Buffers} in the node +@samp{(emacs)Top}. + +@end table + +@node Cursor Commands +@chapter Moving the Cursor +@cindex cursor, moving +Many people find that reading screens of text page by page is made +easier when one is able to indicate particular pieces of text with some +kind of pointing device. Since this is the case, GNU Info (both the +Emacs and standalone versions) have several commands which allow you to +move the cursor about the screen. The notation used in this manual to +describe keystrokes is identical to the notation used within the Emacs +manual, and the GNU Readline manual. @xref{Characters, , Character +Conventions, emacs, the GNU Emacs Manual}, if you are unfamilar with the +notation. + +The following table lists the basic cursor movement commands in Info. +Each entry consists of the key sequence you should type to execute the +cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it +invokes @code{execute-extended-command}. @xref{M-x, , Executing an +extended command, emacs, the GNU Emacs Manual}, for more detailed +information.} command name (displayed in parentheses), and a short +description of what the command does. All of the cursor motion commands +can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands, +@code{universal-argument}}), to find out how to supply them. With a +numeric argument, the motion commands are simply executed that +many times; for example, a numeric argument of 4 given to +@code{next-line} causes the cursor to move down 4 lines. With a +negative numeric argument, the motion is reversed; an argument of -4 +given to the @code{next-line} command would cause the cursor to move +@emph{up} 4 lines. + +@table @asis +@item @code{C-n} (@code{next-line}) +@kindex C-n +@findex next-line +Moves the cursor down to the next line. + +@item @code{C-p} (@code{prev-line}) +@kindex C-p +@findex prev-line +Move the cursor up to the previous line. + +@item @code{C-a} (@code{beginning-of-line}) +@kindex C-a, in Info windows +@findex beginning-of-line +Move the cursor to the start of the current line. + +@item @code{C-e} (@code{end-of-line}) +@kindex C-e, in Info windows +@findex end-of-line +Moves the cursor to the end of the current line. + +@item @code{C-f} (@code{forward-char}) +@kindex C-f, in Info windows +@findex forward-char +Move the cursor forward a character. + +@item @code{C-b} (@code{backward-char}) +@kindex C-b, in Info windows +@findex backward-char +Move the cursor backward a character. + +@item @code{M-f} (@code{forward-word}) +@kindex M-f, in Info windows +@findex forward-word +Moves the cursor forward a word. + +@item @code{M-b} (@code{backward-word}) +@kindex M-b, in Info winows +@findex backward-word +Moves the cursor backward a word. + +@item @code{M-<} (@code{beginning-of-node}) +@itemx @code{b} +@kindex b, in Info winows +@kindex M-< +@findex beginning-of-node +Moves the cursor to the start of the current node. + +@item @code{M->} (@code{end-of-node}) +@kindex M-> +@findex end-of-node +Moves the cursor to the end of the current node. + +@item @code{M-r} (@code{move-to-window-line}) +@kindex M-r +@findex move-to-window-line +Moves the cursor to a specific line of the window. Without a numeric +argument, @code{M-r} moves the cursor to the start of the line in the +center of the window. With a numeric argument of @var{n}, @code{M-r} +moves the cursor to the start of the @var{n}th line in the window. +@end table + +@node Scrolling Commands +@chapter Moving Text Within a Window +@cindex scrolling + +Sometimes you are looking at a screenful of text, and only part of the +current paragraph you are reading is visible on the screen. The +commands detailed in this section are used to shift which part of the +current node is visible on the screen. + +@table @asis +@item @code{SPC} (@code{scroll-forward}) +@itemx @code{C-v} +@kindex SPC, in Info windows +@kindex C-v +@findex scroll-forward +Shift the text in this window up. That is, show more of the node which +is currently below the bottom of the window. With a numeric argument, +show that many more lines at the bottom of the window; a numeric +argument of 4 would shift all of the text in the window up 4 lines +(discarding the top 4 lines), and show you four new lines at the bottom +of the window. Without a numeric argument, @key{SPC} takes the bottom +two lines of the window and places them at the top of the window, +redisplaying almost a completely new screenful of lines. + +@item @code{DEL} (@code{scroll-backward}) +@itemx @code{M-v} +@kindex DEL, in Info windows +@kindex M-v +@findex scroll-backward +Shift the text in this window down. The inverse of +@code{scroll-forward}. + +@end table + +@cindex scrolling through node structure +The @code{scroll-forward} and @code{scroll-backward} commands can also +move forward and backward through the node structure of the file. If +you press @key{SPC} while viewing the end of a node, or @key{DEL} while +viewing the beginning of a node, what happens is controlled by the +variable @code{scroll-behaviour}. @xref{Variables, +@code{scroll-behaviour}}, for more information. + +@table @asis +@item @code{C-l} (@code{redraw-display}) +@kindex C-l +@findex redraw-display +Redraw the display from scratch, or shift the line containing the cursor +to a specified location. With no numeric argument, @samp{C-l} clears +the screen, and then redraws its entire contents. Given a numeric +argument of @var{n}, the line containing the cursor is shifted so that +it is on the @var{n}th line of the window. + +@item @code{C-x w} (@code{toggle-wrap}) +@kindex C-w +@findex toggle-wrap +Toggles the state of line wrapping in the current window. Normally, +lines which are longer than the screen width @dfn{wrap}, i.e., they are +continued on the next line. Lines which wrap have a @samp{\} appearing +in the rightmost column of the screen. You can cause such lines to be +terminated at the rightmost column by changing the state of line +wrapping in the window with @code{C-x w}. When a line which needs more +space than one screen width to display is displayed, a @samp{$} appears +in the rightmost column of the screen, and the remainder of the line is +invisible. +@end table + +@node Node Commands +@chapter Selecting a New Node +@cindex nodes, selection of + +This section details the numerous Info commands which select a new node +to view in the current window. + +The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and +@samp{l}. + +When you are viewing a node, the top line of the node contains some Info +@dfn{pointers} which describe where the next, previous, and up nodes +are. Info uses this line to move about the node structure of the file +when you use the following commands: + +@table @asis +@item @code{n} (@code{next-node}) +@kindex n +@findex next-node +Selects the `Next' node. + +@item @code{p} (@code{prev-node}) +@kindex p +@findex prev-node +Selects the `Prev' node. + +@item @code{u} (@code{up-node}) +@kindex u +@findex up-node +Selects the `Up' node. +@end table + +You can easily select a node that you have already viewed in this window +by using the @samp{l} command -- this name stands for "last", and +actually moves through the list of already visited nodes for this +window. @samp{l} with a negative numeric argument moves forward through +the history of nodes for this window, so you can quickly step between +two adjacent (in viewing history) nodes. + +@table @asis +@item @code{l} (@code{history-node}) +@kindex l +@findex history-node +Selects the most recently selected node in this window. +@end table + +Two additional commands make it easy to select the most commonly +selected nodes; they are @samp{t} and @samp{d}. + +@table @asis +@item @code{t} (@code{top-node}) +@kindex t +@findex top-node +Selects the node @samp{Top} in the current info file. + +@item @code{d} (@code{dir-node}) +@kindex d +@findex dir-node +Selects the directory node (i.e., the node @samp{(dir)}). +@end table + +Here are some other commands which immediately result in the selection +of a different node in the current window: + +@table @asis +@item @code{<} (@code{first-node}) +@kindex < +@findex first-node +Selects the first node which appears in this file. This node is most +often @samp{Top}, but it doesn't have to be. + +@item @code{>} (@code{last-node}) +@kindex > +@findex last-node +Selects the last node which appears in this file. + +@item @code{]} (@code{global-next-node}) +@kindex ] +@findex global-next-node +Moves forward or down through node structure. If the node that you are +currently viewing has a @samp{Next} pointer, that node is selected. +Otherwise, if this node has a menu, the first menu item is selected. If +there is no @samp{Next} and no menu, the same process is tried with the +@samp{Up} node of this node. + +@item @code{[} (@code{global-prev-node}) +@kindex [ +@findex global-prev-node +Moves backward or up through node structure. If the node that you are +currently viewing has a @samp{Prev} pointer, that node is selected. +Otherwise, if the node has an @samp{Up} pointer, that node is selected, +and if it has a menu, the last item in the menu is selected. +@end table + +You can get the same behaviour as @code{global-next-node} and +@code{global-prev-node} while simply scrolling through the file with +@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behaviour}}, for +more information. + +@table @asis +@item @code{g} (@code{goto-node}) +@kindex g +@findex goto-node +Reads the name of a node and selects it. No completion is done while +reading the node name, since the desired node may reside in a separate +file. The node must be typed exactly as it appears in the info file. A +file name may be included as with any node specification, for example + +@example +@code{g(emacs)Buffers} +@end example + +finds the node @samp{Buffers} in the info file @file{emacs}. + +@item @code{C-x k} (@code{kill-node}) +@kindex C-x k +@findex kill-node +Kills a node. The node name is prompted for in the echo area, with a +default of the current node. @dfn{Killing} a node means that Info tries +hard to forget about it, removing it from the list of history nodes kept +for the window where that node is found. Another node is selected in +the window which contained the killed node. + +@item @code{C-x C-f} (@code{view-file}) +@kindex C-x C-f +@findex view-file +Reads the name of a file and selects the entire file. The command +@example +@code{C-x C-f @var{filename}} +@end example +is equivalent to typing +@example +@code{g(@var{filename})*} +@end example + +@item @code{C-x C-b} (@code{list-visited-nodes}) +@kindex C-x C-b +@findex list-visited-nodes +Makes a window containing a menu of all of the currently visited nodes. +This window becomes the selected window, and you may use the standard +Info commands within it. + +@item @code{C-x b} (@code{select-visited-node}) +@kindex C-x b +@findex select-visited-node +Selects a node which has been previously visited in a visible window. +This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is +created. +@end table + +@node Searching Commands +@chapter Searching an Info File +@cindex searching + +GNU Info allows you to search for a sequence of characters throughout an +entire info file, search through the indices of an info file, or find +areas within an info file which discuss a particular topic. + +@table @asis +@item @code{s} (@code{search}) +@kindex s +@findex search +Reads a string in the echo area and searches for it. + +@item @code{C-s} (@code{isearch-forward}) +@kindex C-s +@findex isearch-forward +Interactively searches forward through the info file for a string as you +type it. + +@item @code{C-r} (@code{isearch-backward}) +@kindex C-r +@findex isearch-backward +Interactively searches backward through the info file for a string as +you type it. + +@item @code{i} (@code{index-search}) +@kindex i +@findex index-search +Looks up a string in the indices for this info file, and selects a node +where the found index entry points to. + +@item @code{,} (@code{next-index-match}) +@kindex , +@findex next-index-match +Moves to the node containing the next matching index item from the last +@samp{i} command. +@end table + +The most basic searching command is @samp{s} (@code{search}). The +@samp{s} command prompts you for a string in the echo area, and then +searches the remainder of the info file for an ocurrence of that string. +If the string is found, the node containing it is selected, and the +cursor is left positioned at the start of the found string. Subsequent +@samp{s} commands show you the default search string within @samp{[} and +@samp{]}; pressing @key{RET} instead of typing a new string will use the +default search string. + +@dfn{Incremental searching} is similar to basic searching, but the +string is looked up while you are typing it, instead of waiting until +the entire search string has been specified. + +@node Xref Commands +@chapter Selecting Cross References + +We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up} +pointers which appear at the top of a node. In addition to these +pointers, a node may contain other pointers which refer you to a +different node, perhaps in another info file. Such pointers are called +@dfn{cross references}, or @dfn{xrefs} for short. + +@menu +* Parts of an Xref:: What a cross reference is made of. +* Selecting Xrefs:: Commands for selecting menu or note items. +@end menu + +@node Parts of an Xref +@section Parts of an Xref + +Cross references have two major parts: the first part is called the +@dfn{label}; it is the name that you can use to refer to the cross +reference, and the second is the @dfn{target}; it is the full name of +the node that the cross reference points to. + +The target is separated from the label by a colon @samp{:}; first the +label appears, and then the target. For example, in the sample menu +cross reference below, the single colon separates the label from the +target. + +@example +* Foo Label: Foo Target. More information about Foo. +@end example + +Note the @samp{.} which ends the name of the target. The @samp{.} is +not part of the target; it serves only to let Info know where the target +name ends. + +A shorthand way of specifying references allows two adjacent colons to +stand for a target name which is the same as the label name: + +@example +* Foo Commands:: Commands pertaining to Foo. +@end example + +In the above example, the name of the target is the same as the name of +the label, in this case @code{Foo Commands}. + +You will normally see two types of cross references while viewing nodes: +@dfn{menu} references, and @dfn{note} references. Menu references +appear within a node's menu; they begin with a @samp{*} at the beginning +of a line, and continue with a label, a target, and a comment which +describes what the contents of the node pointed to contains. + +Note references appear within the body of the node text; they begin with +@code{*Note}, and continue with a label and a target. + +Like @samp{Next}, @samp{Prev} and @samp{Up} pointers, cross references +can point to any valid node. They are used to refer you to a place +where more detailed information can be found on a particular subject. +Here is a cross reference which points to a node within the Texinfo +documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo +Manual}, for more information on creating your own texinfo cross +references. + +@node Selecting Xrefs +@section Selecting Xrefs + +The following table lists the Info commands which operate on menu items. + +@table @asis +@item @code{1} (@code{menu-digit}) +@itemx @code{2} @dots{} @code{9} +@cindex 1 @dots{} 9, in Info windows +@kindex 1 @dots{} 9, in Info windows +@findex menu-digit +Within an Info window, pressing a single digit, (such as @samp{1}), +selects that menu item, and places its node in the current window. +For convenience, there is one exception; pressing @samp{0} selects the +@emph{last} item in the node's menu. + +@item @code{0} (@code{last-menu-item}) +@kindex 0, in Info windows +@findex last-menu-item +Select the last item in the current node's menu. + +@item @code{m} (@code{menu-item}) +@kindex m +@findex menu-item +Reads the name of a menu item in the echo area and selects its node. +Completion is available while reading the menu label. + +@item @code{M-x find-menu} +@findex find-menu +Moves the cursor to the start of this node's menu. +@end table + +This table lists the Info commands which operate on note cross references. + +@table @asis +@item @code{f} (@code{xref-item}) +@itemx @code{r} +@kindex f +@kindex r +@findex xref-item +Reads the name of a note cross reference in the echo area and selects +its node. Completion is available while reading the cross reference +label. +@end table + +Finally, the next few commands operate on menu or note references alike: + +@table @asis +@item @code{TAB} (@code{move-to-next-xref}) +@kindex TAB, in Info windows +@findex move-to-next-xref +Moves the cursor to the start of the next nearest menu item or note +reference in this node. You can then use @key{RET} +(@code{select-reference-this-line} to select the menu or note reference. + +@item @code{M-TAB} (@code{move-to-prev-xref}) +@kindex M-TAB, in Info windows +@findex move-to-prev-xref +Moves the cursor the start of the nearest previous menu item or note +reference in this node. + +@item @code{RET} (@code{select-reference-this-line}) +@kindex RET, in Info windows +@findex select-reference-this-line +Selects the menu item or note reference appearing on this line. +@end table + +@node Window Commands +@chapter Manipulating Multiple Windows +@cindex windows, manipulating + +A @dfn{window} is a place to show the text of a node. Windows have a +view area where the text of the node is displayed, and an associated +@dfn{mode line}, which briefly describes the node being viewed. + +GNU Info supports multiple windows appearing in a single screen; each +window is separated from the next by its modeline. At any time, there +is only one @dfn{active} window, that is, the window in which the cursor +appears. There are commands available for creating windows, changing +the size of windows, selecting which window is active, and for deleting +windows. + +@menu +* The Mode Line:: What appears in the mode line? +* Basic Windows:: Manipulating windows in Info. +* The Echo Area:: Used for displaying errors and reading input. +@end menu + +@node The Mode Line +@section The Mode Line + +A @dfn{mode line} is a line of inverse video which appears at the bottom +of an info window. It describes the contents of the window just above +it; this information includes the name of the file and node appearing in +that window, the number of screen lines it takes to display the node, +and the percentage of text that is above the top of the window. It can +also tell you if the indirect tags table for this info file needs to be +updated, and whether or not the info file was compressed when stored on +disk. + +Here is a sample mode line for a window containing an uncompressed file +named @file{dir}, showing the node @samp{Top}. + +@example +-----Info: (dir)Top, 40 lines --Top--------------------------------------- + ^^ ^ ^^^ ^^ + (file)Node #lines where +@end example + +When a node comes from a file which is compressed on disk, this is +indicated in the mode line with two small @samp{z}'s. In addition, if +the info file containing the node has been split into subfiles, the name +of the subfile containing the node appears in the modeline as well: + +@example +--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- +@end example + +When Info makes a node internally, such that there is no corresponding +info file on disk, the name of the node is surrounded by asterisks +(@samp{*}). The name itself tells you what the contents of the window +are; the sample mode line below shows an internally constructed node +showing possible completions: + +@example +-----Info: *Completions*, 7 lines --All----------------------------------- +@end example + +@node Basic Windows +@section Window Commands + +It can be convenient to view more than one node at a time. To allow +this, Info can display more than one @dfn{window}. Each window has its +own mode line (@pxref{The Mode Line}) and history of nodes viewed in that +window (@pxref{Node Commands, , @code{history-node}}). + +@table @asis +@item @code{C-x o} (@code{next-window}) +@cindex windows, selecting +@kindex C-x o +@findex next-window +Selects the next window on the screen. Note that the echo area can only be +selected if it is already in use, and you have left it temporarily. +Normally, @samp{C-x o} simply moves the cursor into the next window on +the screen, or if you are already within the last window, into the first +window on the screen. Given a numeric argument, @samp{C-x o} moves over +that many windows. A negative argument causes @samp{C-x o} to select +the previous window on the screen. + +@item @code{M-x prev-window} +@findex prev-window +Selects the previous window on the screen. This is identical to +@samp{C-x o} with a negative argument. + +@item @code{C-x 2} (@code{split-window}) +@cindex windows, creating +@kindex C-x 2 +@findex split-window +Splits the current window into two windows, both showing the same node. +Each window is one half the size of the original window, and the cursor +remains in the original window. The variable @code{automatic-tiling} +can cause all of the windows on the screen to be resized for you +automatically, please @pxref{Variables, , automatic-tiling} for more +information. + +@item @code{C-x 0} (@code{delete-window}) +@cindex windows, deleting +@kindex C-x 0 +@findex delete-window +Deletes the current window from the screen. If you have made too many +windows and your screen appears cluttered, this is the way to get rid of +some of them. + +@item @code{C-x 1} (@code{keep-one-window}) +@kindex C-x 1 +@findex keep-one-window +Deletes all of the windows excepting the current one. + +@item @code{ESC C-v} (@code{scroll-other-window}) +@kindex ESC C-v, in Info windows +@findex scroll-other-window +Scrolls the other window, in the same fashion that @samp{C-v} might +scroll the current window. Given a negative argument, the "other" +window is scrolled backward. + +@item @code{C-x ^} (@code{grow-window}) +@kindex C-x ^ +@findex grow-window +Grows (or shrinks) the current window. Given a numeric argument, grows +the current window that many lines; with a negative numeric argument, +the window is shrunk instead. + +@item @code{C-x t} (@code{tile-windows}) +@cindex tiling +@kindex C-x t +@findex tile-windows +Divides the available screen space among all of the visible windows. +Each window is given an equal portion of the screen in which to display +its contents. The variable @code{automatic-tiling} can cause +@code{tile-windows} to be called when a window is created or deleted. +@xref{Variables, , @code{automatic-tiling}}. +@end table + +@node The Echo Area +@section The Echo Area +@cindex echo area + +The @dfn{echo area} is a one line window which appears at the bottom of +the screen. It is used to display informative or error messages, and to +read lines of input from you when that is necessary. Almost all of the +commands available in the echo area are identical to their Emacs +counterparts, so please refer to that documentation for greater depth of +discussion on the concepts of editing a line of text. The following +table briefly lists the commands that are available while input is being +read in the echo area: + +@table @asis +@item @code{C-f} (@code{echo-area-forward}) +@kindex C-f, in the echo area +@findex echo-area-forward +Moves forward a character. + +@item @code{C-b} (@code{echo-area-backward}) +@kindex C-b, in the echo area +@findex echo-area-backward +Moves backward a character. + +@item @code{C-a} (@code{echo-area-beg-of-line}) +@kindex C-a, in the echo area +@findex echo-area-beg-of-line +Moves to the start of the input line. + +@item @code{C-e} (@code{echo-area-end-of-line}) +@kindex C-e, in the echo area +@findex echo-area-end-of-line +Moves to the end of the input line. + +@item @code{M-f} (@code{echo-area-forward-word}) +@kindex M-f, in the echo area +@findex echo-area-forward-word +Moves forward a word. + +@item @code{M-b} (@code{echo-area-backward-word}) +@kindex M-b, in the echo area +@findex echo-area-backward-word +Moves backward a word. + +@item @code{C-d} (@code{echo-area-delete}) +@kindex C-d, in the echo area +@findex echo-area-delete +Deletes the character under the cursor. + +@item @code{DEL} (@code{echo-area-rubout}) +@kindex DEL, in the echo area +@findex echo-area-rubout +Deletes the character behind the cursor. + +@item @code{C-g} (@code{echo-area-abort}) +@kindex C-g, in the echo area +@findex echo-area-abort +Cancels or quits the current operation. If completion is being read, +@samp{C-g} discards the text of the input line which does not match any +completion. If the input line is empty, @samp{C-g} aborts the calling +function. + +@item @code{RET} (@code{echo-area-newline}) +@kindex RET, in the echo area +@findex echo-area-newline +Accepts (or forces completion of) the current input line. + +@item @code{C-q} (@code{echo-area-quoted-insert}) +@kindex C-q, in the echo area +@findex echo-area-quoted-insert +Inserts the next character verbatim. This is how you can insert control +characters into a search string, for example. + +@item @var{printing character} (@code{echo-area-insert}) +@kindex printing characters, in the echo area +@findex echo-area-insert +Inserts the character. + +@item @code{M-TAB} (@code{echo-area-tab-insert}) +@kindex M-TAB, in the echo area +@findex echo-area-tab-insert +Inserts a TAB character. + +@item @code{C-t} (@code{echo-area-transpose-chars}) +@kindex C-t, in the echo area +@findex echo-area-transpose-chars +Transposes the characters at the cursor. +@end table + +The next group of commands deal with @dfn{killing}, and @dfn{yanking} +text. For an in depth discussion of killing and yanking, +@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual} + +@table @asis +@item @code{M-d} (@code{echo-area-kill-word}) +@kindex M-d, in the echo area +@findex echo-area-kill-word +Kills the word following the cursor. + +@item @code{M-DEL} (@code{echo-area-backward-kill-word}) +@kindex M-DEL, in the echo area +@findex echo-area-backward-kill-word +Kills the word preceding the cursor. + +@item @code{C-k} (@code{echo-area-kill-line}) +@kindex C-k, in the echo area +@findex echo-area-kill-line +Kills the text from the cursor to the end of the line. + +@item @code{C-x DEL} (@code{echo-area-backward-kill-line}) +@kindex C-x DEL, in the echo area +@findex echo-area-backward-kill-line +Kills the text from the cursor to the beginning of the line. + +@item @code{C-y} (@code{echo-area-yank}) +@kindex C-y, in the echo area +@findex echo-area-yank +Yanks back the contents of the last kill. + +@item @code{M-y} (@code{echo-area-yank-pop}) +@kindex M-y, in the echo area +@findex echo-area-yank-pop +Yanks back a previous kill, removing the last yanked text first. +@end table + +Sometimes when reading input in the echo area, the command that needed +input will only accept one of a list of several choices. The choices +represent the @dfn{possible completions}, and you must respond with one +of them. Since there are a limited number of responses you can make, +Info allows you to abbreviate what you type, only typing as much of the +response as is necessary to uniquely identify it. In addition, you can +request Info to fill in as much of the response as is possible; this +is called @dfn{completion}. + +The following commands are available when completing in the echo area: + +@table @asis +@item @code{TAB} (@code{echo-area-complete}) +@itemx @code{SPC} +@kindex TAB, in the echo area +@kindex SPC, in the echo area +@findex echo-area-complete +Inserts as much of a completion as is possible. + +@item @code{?} (@code{echo-area-possible-completions}) +@kindex ?, in the echo area +@findex echo-area-possible-completions +Displays a window containing a list of the possible completions of what +you have typed so far. For example, if the available choices are: +@example +bar +foliate +food +forget +@end example +and you have typed an @samp{f}, followed by @samp{?}, the possible +completions would contain: +@example +foliate +food +forget +@end example +i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC} +or @key{TAB} would result in @samp{fo} appearing in the echo area, since +all of the choices which begin with @samp{f} continue with @samp{o}. +Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate} +appearing in the echo area, since that is the only choice which begins +with @samp{fol}. + +@item @code{ESC C-v} (@code{echo-area-scroll-completions-window}) +@kindex ESC C-v, in the echo area +@findex echo-area-scroll-completions-window +Scrolls the completions window, if that is visible, or the "other" +window if not. +@end table + +@node Printing Nodes +@chapter Printing Out Nodes +@cindex printing + +You may wish to print out the contents of a node as a quick reference +document for later use. Info provides you with a command for doing +this. In general, we recommend that you use @TeX{} to format the +document and print sections of it, by running @code{tex} on the texinfo +source file. + +@table @asis +@item @code{M-x print-node} +@findex print-node +@cindex INFO_PRINT_COMMAND, environment variable +Pipes the contents of the current node through the command in the +environment variable @code{INFO_PRINT_COMMAND}. If the variable doesn't +exist, the node is simply piped to @code{lpr}. +@end table + +@node Miscellaneous Commands +@chapter Miscellaneous Commands + +GNU Info contains several commands which self-document GNU Info: + +@table @asis +@item @code{M-x describe-command} +@cindex functions, describing +@cindex commands, describing +@findex describe-command +Reads the name of an Info command in the echo area and then displays a +brief description of what that command does. + +@item @code{M-x describe-key} +@cindex keys, describing +@findex describe-key +Reads a key sequence in the echo area, and then displays the name and +documentation of the Info command that the key sequence invokes. + +@item @code{M-x describe-variable} +Reads the name of a variable in the echo area and then displays a brief +description of what the variable affects. + +@item @code{M-x where-is} +@findex where-is +Reads the name of an Info command in the echo area, and then displays +a key sequence which can be typed in order to invoke that command. + +@item @code{C-h} (@code{get-help-window}) +@itemx @code{?} +@kindex C-h +@kindex ?, in Info windows +@findex get-help-window +Creates (or moves into) the window displaying @code{*Help*}, and places +a node containing a quick reference card into it. This window displays +the most concise information about GNU Info available. + +@item @code{h} (@code{get-info-help-node}) +@kindex h +@findex get-info-help-node +Tries hard to visit the node @code{(info)Help}. The info file +@file{info.texi} distributed with GNU Info contains this node. Of +course, the file must first be processed with @code{makeinfo}, and then +placed into the location of your info directory. +@end table + +Here are the commands for creating a numeric argument: + +@table @asis +@item @code{C-u} (@code{universal-argument}) +@cindex numeric arguments +@kindex C-u +@findex universal-argument +Starts (or multiplies by 4) the current numeric argument. @samp{C-u} is +a good way to give a small numeric argument to cursor movement or +scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while +@samp{C-u C-u C-n} moves the cursor down 16 lines. + +@item @code{M-1} (@code{add-digit-to-numeric-arg}) +@itemx @code{M-2} @dots{} @code{M-9} +@kindex M-1 @dots{} M-9 +@findex add-digit-to-numeric-arg +Adds the digit value of the invoking key to the current numeric +argument. Once Info is reading a numeric argument, you may just type +the digits of the argument, without the Meta prefix. For example, you +might give @samp{C-l} a numeric argument of 32 by typing: + +@example +@kbd{C-u 3 2 C-l} +@end example +or +@example +@kbd{M-3 2 C-l} +@end example +@end table + +@samp{C-g} is used to abort the reading of a multi-character key +sequence, to cancel lengthy operations (such as multi-file searches) and +to cancel reading input in the echo area. + +@table @asis +@item @code{C-g} (@code{abort-key}) +@cindex cancelling typeahead +@cindex cancelling the current operation +@kindex C-g, in Info windows +@findex abort-key +Cancels current operation. +@end table + +The @samp{q} command of Info simply quits running Info. + +@table @asis +@item @code{q} (@code{quit}) +@cindex quitting +@kindex q +@findex quit +Exits GNU Info. +@end table + +If the operating system tells GNU Info that the screen is 60 lines tall, +and it is actually only 40 lines tall, here is a way to tell Info that +the operating system is correct. + +@table @asis +@item @code{M-x set-screen-height} +@findex set-screen-height +@cindex screen, changing the height of +Reads a height value in the echo area and sets the height of the +displayed screen to that value. +@end table + +Finally, Info provides a convenient way to display footnotes which might +be associated with the current node that you are viewing: + +@table @asis +@item @code{ESC C-f} (@code{show-footnotes}) +@kindex ESC C-f +@findex show-footnotes +@cindex footnotes, displaying +Shows the footnotes (if any) associated with the current node in another +window. You can have Info automatically display the footnotes +associated with a node when the node is selected by setting the variable +@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}. +@end table + +@node Variables +@chapter Manipulating Variables + +GNU Info contains several @dfn{variables} whose values are looked at by various +Info commands. You can change the values of these variables, and thus +change the behaviour of Info to more closely match your environment and +info file reading manner. + +@table @asis +@item @code{M-x set-variable} +@cindex variables, setting +@findex set-variable +Reads the name of a variable, and the value for it, in the echo area and +then sets the variable to that value. Completion is available when +reading the variable name; often, completion is available when reading +the value to give to the variable, but that depends on the variable +itself. If a variable does @emph{not} supply multiple choices to +complete over, it expects a numeric value. + +@item @code{M-x describe-variable} +@cindex variables, describing +@findex describe-variable +Reads the name of a variable in the echo area and then displays a brief +description of what the variable affects. +@end table + +Here is a list of the variables that you can set in Info. + +@table @code +@item automatic-footnotes +@vindex automatic-footnotes +When set to @code{On}, footnotes appear and disappear automatically. +This variable is @code{On} by default. When a node is selected, a +window containing the footnotes which appear in that node is created, +and the footnotes are displayed within the new window. The window that +Info creates to contain the footnotes is called @samp{*Footnotes*}. If +a node is selected which contains no footnotes, and a @samp{*Footnotes*} +window is on the screen, the @samp{*Footnotes*} window is deleted. +Footnote windows created in this fashion are not automatically tiled so +that they can use as little of the display as is possible. + +@item automatic-tiling +@vindex automatic-tiling +When set to @code{On}, creating or deleting a window resizes other +windows. This variable is @code{Off} by default. Normally, typing +@samp{C-x 2} divides the current window into two equal parts. When +@code{automatic-tiling} is set to @code{On}, all of the windows are +resized automatically, keeping an equal number of lines visible in each +window. There are exceptions to the automatic tiling; specifically, the +windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not} +resized through automatic tiling; they remain their original size. + +@item visible-bell +@vindex visible-bell +When set to @code{On}, GNU Info attempts to flash the screen instead of +ringing the bell. This variable is @code{Off} by default. Of course, +Info can only flash the screen if the terminal allows it; in the case +that the terminal does not allow it, the setting of this variable has no +effect. However, you can make Info perform quietly by setting the +@code{errors-ring-bell} variable to @code{Off}. + +@item errors-ring-bell +@vindex errors-ring-bell +When set to @code{On}, errors cause the bell to ring. The default +setting of this variable is @code{On}. + +@item gc-compressed-files +@vindex gc-compressed-files +When set to @code{On}, Info garbage collects files which had to be +uncompressed. The default value of this variable is @code{Off}. +Whenever a node is visited in Info, the info file containing that node +is read into core, and Info reads information about the tags and nodes +contained in that file. Once the tags information is read by Info, it +is never forgotten. However, the actual text of the nodes does not need +to remain in core unless a particular info window needs it. For +non-compressed files, the text of the nodes does not remain in core when +it is no longer in use. But de-compressing a file can be a time +consuming operation, and so Info tries hard not to do it twice. +@code{gc-compressed-files} tells Info it is okay to garbage collect the +text of the nodes of a file which was compressed on disk. + +@item show-index-match +@vindex show-index-match +When set to @code{On}, the portion of the matched search string is +highlighted in the message which explains where the matched search +string was found. The default value of this variable is @code{On}. +When Info displays the location where an index match was found, +(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the +string that you had typed is highlighted by displaying it in the inverse +case from its surrounding characters. + +@item scroll-behaviour +@vindex scroll-behaviour +Controls what happens when forward scrolling is requested at the end of +a node, or when backward scrolling is requested at the beginning of a +node. The default value for this variable is @code{Continuous}. There +are three possible values for this variable: + +@table @code +@item Continuous +Tries to get the first item in this node's menu, or failing that, the +@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}. +This behaviour is identical to using the @samp{]} +(@code{global-next-node}) and @samp{[} (@code{global-prev-node}) +commands. + +@item Next Only +Only tries to get the @samp{Next} node. + +@item Page Only +Simply gives up, changing nothing. If @code{scroll-behaviour} is +@code{Page Only}, no scrolling command can change the node that is being +viewed. +@end table + +@item scroll-step +@vindex scroll-step +The number of lines to scroll when the cursor moves out of the window. +Scrolling happens automatically if the cursor has moved out of the +visible portion of the node text when it is time to display. Usually +the scrolling is done so as to put the cursor on the center line of the +current window. However, if the variable @code{scroll-step} has a +nonzero value, Info attempts to scroll the node text by that many lines; +if that is enough to bring the cursor back into the window, that is what +is done. The default value of this variable is 0, thus placing the +cursor (and the text it is attached to) in the center of the window. +Setting this variable to 1 causes a kind of "smooth scrolling" which +some people prefer. + +@item ISO-Latin +@cindex ISO Latin characters +@vindex ISO-Latin +When set to @code{On}, Info accepts and displays ISO Latin characters. +By default, Info assumes an ASCII character set. @code{ISO-Latin} tells +Info that it is running in an environment where the European standard +character set is in use, and allows you to input such characters to +Info, as well as display them. +@end table + +@c The following node and its children are currently unfinished. Please feel +@c free to finish it! + +@ifset NOTSET +@node Info for Sys Admins +@chapter Info for System Administrators + +This text describes some common ways of setting up an Info heierarchy +from scratch, and details the various options that are available when +installing Info. This text is designed for the person who is installing +GNU Info on the system; although users may find the information present +in this section interesting, none of it is vital to understanding how to +use GNU Info. + +@menu +* Setting the INFOPATH:: Where are my Info files kept? +* Editing the DIR node:: What goes in `DIR', and why? +* Storing Info files:: Alternate formats allow flexibilty in setups. +* Using `localdir':: Building DIR on the fly. +* Example setups:: Some common ways to origanize Info files. +@end menu + +@node Setting the INFOPATH +@section Setting the INFOPATH +Where are my Info files kept? + +@node Editing the DIR node +@section Editing the DIR node +What goes in `DIR', and why? + +@node Storing Info files +@section Storing Info files +Alternate formats allow flexibilty in setups. + +@node Using `localdir' +@section Using `localdir' +Building DIR on the fly. + +@node Example setups +@section Example setups +Some common ways to origanize Info files. +@end ifset + +@ifset STANDALONE +@node GNU Info Global Index +@appendix Global Index +@printindex cp +@end ifset diff --git a/gnu/usr.bin/texinfo/emacs/Makefile.am b/gnu/usr.bin/texinfo/emacs/Makefile.am new file mode 100644 index 00000000000..5907f0874f4 --- /dev/null +++ b/gnu/usr.bin/texinfo/emacs/Makefile.am @@ -0,0 +1,21 @@ +## Makefile.am for texinfo/emacs. +## $Id: Makefile.am,v 1.1 1997/08/01 21:59:44 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +# Do not byte compile our Elisp files by default. +ELCFILES = + +# Do not install our Elisp files by default, either. +noinst_LISP = info.el informat.el makeinfo.el \ + texinfmt.el texinfo.el texnfo-upd.el + +EXTRA_DIST = README elisp-comp new-useful-setqs $(noinst_LISP) + +install-data-local: + @echo "WARNING: You must (compile and) install the Emacs Lisp files" + @echo "WARNING: manually. See ./emacs/README for some considerations." + +# For some reason these do not get defined. +distclean-lisp: +clean-lisp: +mostlyclean-lisp: diff --git a/gnu/usr.bin/texinfo/emacs/README b/gnu/usr.bin/texinfo/emacs/README new file mode 100644 index 00000000000..23053166c3f --- /dev/null +++ b/gnu/usr.bin/texinfo/emacs/README @@ -0,0 +1,17 @@ +This directory contains Emacs Lisp sources related to Texinfo. + +M-x texinfo-format-buffer is no longer the standard way to make .info +files, and may or may not work. Use makeinfo instead. See the +`makeinfo advantages' in the manual for why. + +The files here may or may not be newer than the versions in the latest +Emacs distribution -- there is only one master source, so it simply +depends on what was released later. Use whatever works better for you. + +They are not compiled or installed by default, because of the above, and +also due to the wide variations in sites' Emacs installations. + +Even if you do install them, you may not want to compile them if your +site is running multiple versions of Emacs, since .elc files are not +portable between all Emacs releases. If you do want to compile them, +just run the ./elisp-comp shell script. diff --git a/gnu/usr.bin/texinfo/info/Makefile.am b/gnu/usr.bin/texinfo/info/Makefile.am new file mode 100644 index 00000000000..6ff91f8a51c --- /dev/null +++ b/gnu/usr.bin/texinfo/info/Makefile.am @@ -0,0 +1,44 @@ +## Makefile.am for texinfo/info. +## $Id: Makefile.am,v 1.1 1997/08/01 21:59:59 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +noinst_PROGRAMS = makedoc + +# Use `ginfo' for building to avoid confusion with the standard `info' +# target. The install rule removes the `g' before applying any +# user-specified name transformations. +bin_PROGRAMS = ginfo +transform = s/ginfo/info/; @program_transform_name@ + +localedir = $(datadir)/locale + +# -I. for funs.h. +INCLUDES = -I. -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\" +LDADD = ../lib/libtxi.a @TERMLIBS@ @INTLLIBS@ + +makedoc_SOURCES = makedoc.c +ginfo_SOURCES = dir.c display.c display.h doc.c doc.h dribble.c dribble.h \ + echo-area.c echo-area.h \ + filesys.c filesys.h footnotes.c footnotes.h funs.h gc.c gc.h \ + indices.c indices.h info-utils.c info-utils.h info.c info.h infodoc.c \ + infomap.c infomap.h m-x.c man.c man.h nodemenu.c nodes.c nodes.h \ + search.c search.h session.c session.h signals.c signals.h \ + termdep.h terminal.c terminal.h tilde.c tilde.h \ + variables.c variables.h window.c window.h + +EXTRA_DIST = README + +# The files `doc.c' and `funs.h' are created by ./makedoc run over the source +# files which contain DECLARE_INFO_COMMAND. `funs.h' is a header file +# listing the functions found. `doc.c' is a structure containing pointers +# to those functions along with completable names and documentation strings. +# +# I do not know how to get this right. +# BUILT_SOURCES = doc.c funs.h +# +#cmd_sources = $(srcdir)/session.c $(srcdir)/echo-area.c $(srcdir)/infodoc.c \ +# $(srcdir)/m-x.c $(srcdir)/indices.c $(srcdir)/nodemenu.c \ +# $(srcdir)/footnotes.c $(srcdir)/variables.c +# +#$(BUILTSOURCES): makedoc $(cmd_sources) +# ./makedoc $(cmd_sources) diff --git a/gnu/usr.bin/texinfo/info/README b/gnu/usr.bin/texinfo/info/README index d8f1ab624d8..90d3e2cd522 100644 --- a/gnu/usr.bin/texinfo/info/README +++ b/gnu/usr.bin/texinfo/info/README @@ -1,9 +1,3 @@ -The file NEWS contains information about what has changed since the last -release. - -The file ../INSTALL contains instructions on how to install Info. - - Info 2.0 is a complete rewrite of the original standalone Info I wrote in 1987, the first program I wrote for rms. That program was something like my second Unix program ever, and my die-hard machine language coding habits diff --git a/gnu/usr.bin/texinfo/info/doc.c b/gnu/usr.bin/texinfo/info/doc.c new file mode 100644 index 00000000000..3859b7fd66a --- /dev/null +++ b/gnu/usr.bin/texinfo/info/doc.c @@ -0,0 +1,129 @@ +/* doc.c -- Generated structure containing function names and doc strings. + + This file was automatically made from various source files with the + command "./makedoc". DO NOT EDIT THIS FILE, only "./makedoc.c". + Source files groveled to make this file include: + + ./session.c + ./echo-area.c + ./infodoc.c + ./m-x.c + ./indices.c + ./nodemenu.c + ./footnotes.c + ./variables.c + + An entry in the array FUNCTION_DOC_ARRAY is made for each command + found in the above files; each entry consists of a function pointer, + a string which is the user-visible name of the function, + and a string which documents its purpose. */ + +#include "doc.h" +#include "funs.h" + +FUNCTION_DOC function_doc_array[] = { + +/* Commands found in "./session.c". */ + { info_next_line, "next-line", N_("Move down to the next line") }, + { info_prev_line, "prev-line", N_("Move up to the previous line") }, + { info_end_of_line, "end-of-line", N_("Move to the end of the line") }, + { info_beginning_of_line, "beginning-of-line", N_("Move to the start of the line") }, + { info_forward_char, "forward-char", N_("Move forward a character") }, + { info_backward_char, "backward-char", N_("Move backward a character") }, + { info_forward_word, "forward-word", N_("Move forward a word") }, + { info_backward_word, "backward-word", N_("Move backward a word") }, + { info_global_next_node, "global-next-node", N_("Move forwards or down through node structure") }, + { info_global_prev_node, "global-prev-node", N_("Move backwards or up through node structure") }, + { info_scroll_forward, "scroll-forward", N_("Scroll forward in this window") }, + { info_scroll_backward, "scroll-backward", N_("Scroll backward in this window") }, + { info_beginning_of_node, "beginning-of-node", N_("Move to the start of this node") }, + { info_end_of_node, "end-of-node", N_("Move to the end of this node") }, + { info_next_window, "next-window", N_("Select the next window") }, + { info_prev_window, "prev-window", N_("Select the previous window") }, + { info_split_window, "split-window", N_("Split the current window") }, + { info_delete_window, "delete-window", N_("Delete the current window") }, + { info_keep_one_window, "keep-one-window", N_("Delete all other windows") }, + { info_scroll_other_window, "scroll-other-window", N_("Scroll the other window") }, + { info_grow_window, "grow-window", N_("Grow (or shrink) this window") }, + { info_tile_windows, "tile-windows", N_("Divide the available screen space among the visible windows") }, + { info_toggle_wrap, "toggle-wrap", N_("Toggle the state of line wrapping in the current window") }, + { info_next_node, "next-node", N_("Select the `Next' node") }, + { info_prev_node, "prev-node", N_("Select the `Prev' node") }, + { info_up_node, "up-node", N_("Select the `Up' node") }, + { info_last_node, "last-node", N_("Select the last node in this file") }, + { info_first_node, "first-node", N_("Select the first node in this file") }, + { info_history_node, "history-node", N_("Select the most recently selected node") }, + { info_last_menu_item, "last-menu-item", N_("Select the last item in this node's menu") }, + { info_menu_digit, "menu-digit", N_("Select this menu item") }, + { info_menu_item, "menu-item", N_("Read a menu item and select its node") }, + { info_xref_item, "xref-item", N_("Read a footnote or cross reference and select its node") }, + { info_find_menu, "find-menu", N_("Move to the start of this node's menu") }, + { info_visit_menu, "visit-menu", N_("Visit as many menu items at once as possible") }, + { info_goto_node, "goto-node", N_("Read a node name and select it") }, + { info_man, "man", N_("Read a manpage reference and select it") }, + { info_top_node, "top-node", N_("Select the node `Top' in this file") }, + { info_dir_node, "dir-node", N_("Select the node `(dir)'") }, + { info_kill_node, "kill-node", N_("Kill this node") }, + { info_view_file, "view-file", N_("Read the name of a file and select it") }, + { info_print_node, "print-node", N_("Pipe the contents of this node through INFO_PRINT_COMMAND") }, + { info_search, "search", N_("Read a string and search for it") }, + { isearch_forward, "isearch-forward", N_("Search interactively for a string as you type it") }, + { isearch_backward, "isearch-backward", N_("Search interactively for a string as you type it") }, + { info_move_to_prev_xref, "move-to-prev-xref", N_("Move to the previous cross reference") }, + { info_move_to_next_xref, "move-to-next-xref", N_("Move to the next cross reference") }, + { info_select_reference_this_line, "select-reference-this-line", N_("Select reference or menu item appearing on this line") }, + { info_abort_key, "abort-key", N_("Cancel current operation") }, + { info_move_to_window_line, "move-to-window-line", N_("Move to the cursor to a specific line of the window") }, + { info_redraw_display, "redraw-display", N_("Redraw the display") }, + { info_quit, "quit", N_("Quit using Info") }, + { info_do_lowercase_version, "do-lowercase-version", "" }, + { info_add_digit_to_numeric_arg, "add-digit-to-numeric-arg", N_("Add this digit to the current numeric argument") }, + { info_universal_argument, N_("universal-argument"), N_("Start (or multiply by 4) the current numeric argument") }, + { info_numeric_arg_digit_loop, "numeric-arg-digit-loop", N_("Internally used by \\[universal-argument]") }, +/* Commands found in "./echo-area.c". */ + { ea_forward, "echo-area-forward", N_("Move forward a character") }, + { ea_backward, "echo-area-backward", N_("Move backward a character") }, + { ea_beg_of_line, "echo-area-beg-of-line", N_("Move to the start of this line") }, + { ea_end_of_line, "echo-area-end-of-line", N_("Move to the end of this line") }, + { ea_forward_word, "echo-area-forward-word", N_("Move forward a word") }, + { ea_backward_word, "echo-area-backward-word", N_("Move backward a word") }, + { ea_delete, "echo-area-delete", N_("Delete the character under the cursor") }, + { ea_rubout, "echo-area-rubout", N_("Delete the character behind the cursor") }, + { ea_abort, "echo-area-abort", N_("Cancel or quit operation") }, + { ea_newline, "echo-area-newline", N_("Accept (or force completion of) this line") }, + { ea_quoted_insert, "echo-area-quoted-insert", N_("Insert next character verbatim") }, + { ea_insert, "echo-area-insert", N_("Insert this character") }, + { ea_tab_insert, "echo-area-tab-insert", N_("Insert a TAB character") }, + { ea_transpose_chars, "echo-area-transpose-chars", N_("Transpose characters at point") }, + { ea_yank, "echo-area-yank", N_("Yank back the contents of the last kill") }, + { ea_yank_pop, "echo-area-yank-pop", N_("Yank back a previous kill") }, + { ea_kill_line, "echo-area-kill-line", N_("Kill to the end of the line") }, + { ea_backward_kill_line, "echo-area-backward-kill-line", N_("Kill to the beginning of the line") }, + { ea_kill_word, "echo-area-kill-word", N_("Kill the word following the cursor") }, + { ea_backward_kill_word, "echo-area-backward-kill-word", N_("Kill the word preceding the cursor") }, + { ea_possible_completions, "echo-area-possible-completions", N_("List possible completions") }, + { ea_complete, "echo-area-complete", N_("Insert completion") }, + { ea_scroll_completions_window, "echo-area-scroll-completions-window", N_("Scroll the completions window") }, +/* Commands found in "./infodoc.c". */ + { info_get_help_window, "get-help-window", N_("Display help message") }, + { info_get_info_help_node, "get-info-help-node", N_("Visit Info node `(info)Help'") }, + { describe_key, "describe-key", N_("Print documentation for KEY") }, + { info_where_is, "where-is", N_("Show what to type to execute a given command") }, +/* Commands found in "./m-x.c". */ + { describe_command, "describe-command", N_("Read the name of an Info command and describe it") }, + { info_execute_command, "execute-command", N_("Read a command name in the echo area and execute it") }, + { set_screen_height, "set-screen-height", N_("Set the height of the displayed window") }, +/* Commands found in "./indices.c". */ + { info_index_search, "index-search", N_("Look up a string in the index for this file") }, + { info_next_index_match, "next-index-match", N_("Go to the next matching index item from the last `\\[index-search]' command") }, + { info_index_apropos, "index-apropos", N_("Grovel all known info file's indices for a string and build a menu") }, +/* Commands found in "./nodemenu.c". */ + { list_visited_nodes, "list-visited-nodes", N_("Make a window containing a menu of all of the currently visited nodes") }, + { select_visited_node, "select-visited-node", N_("Select a node which has been previously visited in a visible window") }, +/* Commands found in "./footnotes.c". */ + { info_show_footnotes, "show-footnotes", N_("Show the footnotes associated with this node in another window") }, +/* Commands found in "./variables.c". */ + { describe_variable, "describe-variable", N_("Explain the use of a variable") }, + { set_variable, "set-variable", N_("Set the value of an Info variable") }, + { (VFunction *)NULL, (char *)NULL, (char *)NULL } +}; diff --git a/gnu/usr.bin/texinfo/info/doc.h b/gnu/usr.bin/texinfo/info/doc.h index 8afc28f7446..423998e37c8 100644 --- a/gnu/usr.bin/texinfo/info/doc.h +++ b/gnu/usr.bin/texinfo/info/doc.h @@ -21,18 +21,10 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#if !defined (_DOC_H_) -#define _DOC_H_ +#if !defined (DOC_H) +#define DOC_H -#if !defined (NULL) -# define NULL 0x0 -#endif /* !NULL */ - -#if !defined (__FUNCTION_DEF) -# define __FUNCTION_DEF -typedef int Function (); -typedef void VFunction (); -#endif /* _FUNCTION_DEF */ +#include "info.h" /* for NAMED_FUNCTIONS, VFunction, etc. */ typedef struct { VFunction *func; @@ -55,4 +47,4 @@ extern void dump_map_to_message_buffer (); extern char *function_name (); extern VFunction *named_function (); #endif /* NAMED_FUNCTIONS */ -#endif /* !_DOC_H_ */ +#endif /* !DOC_H */ diff --git a/gnu/usr.bin/texinfo/info/dribble.c b/gnu/usr.bin/texinfo/info/dribble.c index 8e16cea4e45..d1d58486560 100644 --- a/gnu/usr.bin/texinfo/info/dribble.c +++ b/gnu/usr.bin/texinfo/info/dribble.c @@ -21,7 +21,7 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#include <stdio.h> +#include "info.h" #include "dribble.h" /* When non-zero, it is a stream to write all input characters to for the diff --git a/gnu/usr.bin/texinfo/info/echo-area.c b/gnu/usr.bin/texinfo/info/echo-area.c new file mode 100644 index 00000000000..f3e7a04f5af --- /dev/null +++ b/gnu/usr.bin/texinfo/info/echo-area.c @@ -0,0 +1,1505 @@ +/* echo-area.c -- How to read a line in the echo area. + $Id: echo-area.c,v 1.1 1997/08/01 22:00:07 kstailey Exp $ + + Copyright (C) 1993, 97 Free Software Foundation, Inc. + + 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. + + Written by Brian Fox (bfox@ai.mit.edu). */ + +#include "info.h" + +#if defined (FD_SET) +# if defined (hpux) +# define fd_set_cast(x) (int *)(x) +# else +# define fd_set_cast(x) (fd_set *)(x) +# endif /* !hpux */ +#endif /* FD_SET */ + +/* Non-zero means that C-g was used to quit reading input. */ +int info_aborted_echo_area = 0; + +/* Non-zero means that the echo area is being used to read input. */ +int echo_area_is_active = 0; + +/* The address of the last command executed in the echo area. */ +VFunction *ea_last_executed_command = (VFunction *)NULL; + +/* Non-zero means that the last command executed while reading input + killed some text. */ +int echo_area_last_command_was_kill = 0; + +/* Variables which hold on to the current state of the input line. */ +static char input_line[1 + EA_MAX_INPUT]; +static char *input_line_prompt; +static int input_line_point; +static int input_line_beg; +static int input_line_end; +static NODE input_line_node = { + (char *)NULL, (char *)NULL, (char *)NULL, input_line, EA_MAX_INPUT, 0 +}; + +static void echo_area_initialize_node (); +static void push_echo_area (), pop_echo_area (); +static int echo_area_stack_contains_completions_p (); + +static void ea_kill_text (); + +/* Non-zero means we force the user to complete. */ +static int echo_area_must_complete_p = 0; +static int completions_window_p (); + +/* If non-null, this is a window which was specifically created to display + possible completions output. We remember it so we can delete it when + appropriate. */ +static WINDOW *echo_area_completions_window = (WINDOW *)NULL; + +/* Variables which keep track of the window which was active prior to + entering the echo area. */ +static WINDOW *calling_window = (WINDOW *)NULL; +static NODE *calling_window_node = (NODE *)NULL; +static long calling_window_point = 0; +static long calling_window_pagetop = 0; + +/* Remember the node and pertinent variables of the calling window. */ +static void +remember_calling_window (window) + WINDOW *window; +{ + /* Only do this if the calling window is not the completions window, or, + if it is the completions window and there is no other window. */ + if (!completions_window_p (window) || + ((window == windows) && !(window->next))) + { + calling_window = window; + calling_window_node = window->node; + calling_window_point = window->point; + calling_window_pagetop = window->pagetop; + } +} + +/* Restore the caller's window so that it shows the node that it was showing + on entry to info_read_xxx_echo_area (). */ +static void +restore_calling_window () +{ + register WINDOW *win, *compwin = (WINDOW *)NULL; + + /* If the calling window is still visible, and it is the window that + we used for completions output, then restore the calling window. */ + for (win = windows; win; win = win->next) + { + if (completions_window_p (win)) + compwin = win; + + if (win == calling_window && win == compwin) + { + window_set_node_of_window (calling_window, calling_window_node); + calling_window->point = calling_window_point; + calling_window->pagetop = calling_window_pagetop; + compwin = (WINDOW *)NULL; + break; + } + } + + /* Delete the completions window if it is still present, it isn't the + last window on the screen, and there aren't any prior echo area reads + pending which created a completions window. */ + if (compwin) + { + if ((compwin != windows || windows->next) && + !echo_area_stack_contains_completions_p ()) + { + WINDOW *next; + int pagetop, start, end, amount; + + next = compwin->next; + if (next) + { + start = next->first_row; + end = start + next->height; + amount = - (compwin->height + 1); + pagetop = next->pagetop; + } + + info_delete_window_internal (compwin); + + /* This is not necessary because info_delete_window_internal () + calls echo_area_inform_of_deleted_window (), which does the + right thing. */ +#if defined (UNNECESSARY) + echo_area_completions_window = (WINDOW *)NULL; +#endif /* UNNECESSARY */ + + if (next) + { + display_scroll_display (start, end, amount); + next->pagetop = pagetop; + display_update_display (windows); + } + } + } +} + +/* Set up a new input line with PROMPT. */ +static void +initialize_input_line (prompt) + char *prompt; +{ + input_line_prompt = prompt; + if (prompt) + strcpy (input_line, prompt); + else + input_line[0] = '\0'; + + input_line_beg = input_line_end = input_line_point = strlen (prompt); +} + +static char * +echo_area_after_read () +{ + char *return_value; + + if (info_aborted_echo_area) + { + info_aborted_echo_area = 0; + return_value = (char *)NULL; + } + else + { + if (input_line_beg == input_line_end) + return_value = xstrdup (""); + else + { + int line_len = input_line_end - input_line_beg; + return_value = (char *) xmalloc (1 + line_len); + strncpy (return_value, &input_line[input_line_beg], line_len); + return_value[line_len] = '\0'; + } + } + return (return_value); +} + +/* Read a line of text in the echo area. Return a malloc ()'ed string, + or NULL if the user aborted out of this read. WINDOW is the currently + active window, so that we can restore it when we need to. PROMPT, if + non-null, is a prompt to print before reading the line. */ +char * +info_read_in_echo_area (window, prompt) + WINDOW *window; + char *prompt; +{ + char *line; + + /* If the echo area is already active, remember the current state. */ + if (echo_area_is_active) + push_echo_area (); + + /* Initialize our local variables. */ + initialize_input_line (prompt); + + /* Initialize the echo area for the first (but maybe not the last) time. */ + echo_area_initialize_node (); + + /* Save away the original node of this window, and the window itself, + so echo area commands can temporarily use this window. */ + remember_calling_window (window); + + /* Let the rest of Info know that the echo area is active. */ + echo_area_is_active++; + active_window = the_echo_area; + + /* Read characters in the echo area. */ + info_read_and_dispatch (); + + echo_area_is_active--; + + /* Restore the original active window and show point in it. */ + active_window = calling_window; + restore_calling_window (); + display_cursor_at_point (active_window); + fflush (stdout); + + /* Get the value of the line. */ + line = echo_area_after_read (); + + /* If there is a previous loop waiting for us, restore it now. */ + if (echo_area_is_active) + pop_echo_area (); + + /* Return the results to the caller. */ + return (line); +} + +/* (re) Initialize the echo area node. */ +static void +echo_area_initialize_node () +{ + register int i; + + for (i = input_line_end; i < sizeof (input_line); i++) + input_line[i] = ' '; + + input_line[i - 1] = '\n'; + window_set_node_of_window (the_echo_area, &input_line_node); + input_line[input_line_end] = '\n'; +} + +/* Prepare to read characters in the echo area. This can initialize the + echo area node, but its primary purpose is to side effect the input + line buffer contents. */ +void +echo_area_prep_read () +{ + if (the_echo_area->node != &input_line_node) + echo_area_initialize_node (); + + the_echo_area->point = input_line_point; + input_line[input_line_end] = '\n'; + display_update_one_window (the_echo_area); + display_cursor_at_point (active_window); +} + + +/* **************************************************************** */ +/* */ +/* Echo Area Movement Commands */ +/* */ +/* **************************************************************** */ + +DECLARE_INFO_COMMAND (ea_forward, _("Move forward a character")) +{ + if (count < 0) + ea_backward (window, -count, key); + else + { + input_line_point += count; + if (input_line_point > input_line_end) + input_line_point = input_line_end; + } +} + +DECLARE_INFO_COMMAND (ea_backward, _("Move backward a character")) +{ + if (count < 0) + ea_forward (window, -count, key); + else + { + input_line_point -= count; + if (input_line_point < input_line_beg) + input_line_point = input_line_beg; + } +} + +DECLARE_INFO_COMMAND (ea_beg_of_line, _("Move to the start of this line")) +{ + input_line_point = input_line_beg; +} + +DECLARE_INFO_COMMAND (ea_end_of_line, _("Move to the end of this line")) +{ + input_line_point = input_line_end; +} + +#define alphabetic(c) (islower (c) || isupper (c) || isdigit (c)) + +/* Move forward a word in the input line. */ +DECLARE_INFO_COMMAND (ea_forward_word, _("Move forward a word")) +{ + int c; + + if (count < 0) + ea_backward_word (window, -count, key); + else + { + while (count--) + { + if (input_line_point == input_line_end) + return; + + /* If we are not in a word, move forward until we are in one. + Then, move forward until we hit a non-alphabetic character. */ + c = input_line[input_line_point]; + + if (!alphabetic (c)) + { + while (++input_line_point < input_line_end) + { + c = input_line[input_line_point]; + if (alphabetic (c)) + break; + } + } + + if (input_line_point == input_line_end) + return; + + while (++input_line_point < input_line_end) + { + c = input_line[input_line_point]; + if (!alphabetic (c)) + break; + } + } + } +} + +DECLARE_INFO_COMMAND (ea_backward_word, _("Move backward a word")) +{ + int c; + + if (count < 0) + ea_forward_word (window, -count, key); + else + { + while (count--) + { + if (input_line_point == input_line_beg) + return; + + /* Like ea_forward_word (), except that we look at the + characters just before point. */ + + c = input_line[input_line_point - 1]; + + if (!alphabetic (c)) + { + while ((--input_line_point) != input_line_beg) + { + c = input_line[input_line_point - 1]; + if (alphabetic (c)) + break; + } + } + + while (input_line_point != input_line_beg) + { + c = input_line[input_line_point - 1]; + if (!alphabetic (c)) + break; + else + --input_line_point; + } + } + } +} + +DECLARE_INFO_COMMAND (ea_delete, _("Delete the character under the cursor")) +{ + register int i; + + if (count < 0) + ea_rubout (window, -count, key); + else + { + if (input_line_point == input_line_end) + return; + + if (info_explicit_arg || count > 1) + { + int orig_point; + + orig_point = input_line_point; + ea_forward (window, count, key); + ea_kill_text (orig_point, input_line_point); + input_line_point = orig_point; + } + else + { + for (i = input_line_point; i < input_line_end; i++) + input_line[i] = input_line[i + 1]; + + input_line_end--; + } + } +} + +DECLARE_INFO_COMMAND (ea_rubout, _("Delete the character behind the cursor")) +{ + if (count < 0) + ea_delete (window, -count, key); + else + { + int start; + + if (input_line_point == input_line_beg) + return; + + start = input_line_point; + ea_backward (window, count, key); + + if (info_explicit_arg || count > 1) + ea_kill_text (start, input_line_point); + else + ea_delete (window, count, key); + } +} + +DECLARE_INFO_COMMAND (ea_abort, _("Cancel or quit operation")) +{ + /* If any text, just discard it, and restore the calling window's node. + If no text, quit. */ + if (input_line_end != input_line_beg) + { + terminal_ring_bell (); + input_line_end = input_line_point = input_line_beg; + if (calling_window->node != calling_window_node) + restore_calling_window (); + } + else + info_aborted_echo_area = 1; +} + +DECLARE_INFO_COMMAND (ea_newline, _("Accept (or force completion of) this line")) +{ + /* Stub does nothing. Simply here to see if it has been executed. */ +} + +DECLARE_INFO_COMMAND (ea_quoted_insert, _("Insert next character verbatim")) +{ + unsigned char character; + + character = info_get_another_input_char (); + ea_insert (window, count, character); +} + +DECLARE_INFO_COMMAND (ea_insert, _("Insert this character")) +{ + register int i; + + if ((input_line_end + 1) == EA_MAX_INPUT) + { + terminal_ring_bell (); + return; + } + + for (i = input_line_end + 1; i != input_line_point; i--) + input_line[i] = input_line[i - 1]; + + input_line[input_line_point] = key; + input_line_point++; + input_line_end++; +} + +DECLARE_INFO_COMMAND (ea_tab_insert, _("Insert a TAB character")) +{ + ea_insert (window, count, '\t'); +} + +/* Transpose the characters at point. If point is at the end of the line, + then transpose the characters before point. */ +DECLARE_INFO_COMMAND (ea_transpose_chars, _("Transpose characters at point")) +{ + /* Handle conditions that would make it impossible to transpose + characters. */ + if (!count || !input_line_point || (input_line_end - input_line_beg) < 2) + return; + + while (count) + { + int t; + if (input_line_point == input_line_end) + { + t = input_line[input_line_point - 1]; + + input_line[input_line_point - 1] = input_line[input_line_point - 2]; + input_line[input_line_point - 2] = t; + } + else + { + t = input_line[input_line_point]; + + input_line[input_line_point] = input_line[input_line_point - 1]; + input_line[input_line_point - 1] = t; + + if (count < 0 && input_line_point != input_line_beg) + input_line_point--; + else + input_line_point++; + } + + if (count < 0) + count++; + else + count--; + } +} + +/* **************************************************************** */ +/* */ +/* Echo Area Killing and Yanking */ +/* */ +/* **************************************************************** */ + +static char **kill_ring = (char **)NULL; +static int kill_ring_index = 0; /* Number of kills appearing in KILL_RING. */ +static int kill_ring_slots = 0; /* Number of slots allocated to KILL_RING. */ +static int kill_ring_loc = 0; /* Location of current yank pointer. */ + +/* The largest number of kills that we remember at one time. */ +static int max_retained_kills = 15; + +DECLARE_INFO_COMMAND (ea_yank, _("Yank back the contents of the last kill")) +{ + register int i; + register char *text; + + if (!kill_ring_index) + { + inform_in_echo_area (_("Kill ring is empty")); + return; + } + + text = kill_ring[kill_ring_loc]; + + for (i = 0; text[i]; i++) + ea_insert (window, 1, text[i]); +} + +/* If the last command was yank, or yank_pop, and the text just before + point is identical to the current kill item, then delete that text + from the line, rotate the index down, and yank back some other text. */ +DECLARE_INFO_COMMAND (ea_yank_pop, _("Yank back a previous kill")) +{ + register int len; + + if (((ea_last_executed_command != ea_yank) && + (ea_last_executed_command != ea_yank_pop)) || + (kill_ring_index == 0)) + return; + + len = strlen (kill_ring[kill_ring_loc]); + + /* Delete the last yanked item from the line. */ + { + register int i, counter; + + counter = input_line_end - input_line_point; + + for (i = input_line_point - len; counter; i++, counter--) + input_line[i] = input_line[i + len]; + + input_line_end -= len; + input_line_point -= len; + } + + /* Get a previous kill, and yank that. */ + kill_ring_loc--; + if (kill_ring_loc < 0) + kill_ring_loc = kill_ring_index - 1; + + ea_yank (window, count, key); +} + +/* Delete the text from point to end of line. */ +DECLARE_INFO_COMMAND (ea_kill_line, _("Kill to the end of the line")) +{ + if (count < 0) + { + ea_kill_text (input_line_point, input_line_beg); + input_line_point = input_line_beg; + } + else + ea_kill_text (input_line_point, input_line_end); +} + +/* Delete the text from point to beg of line. */ +DECLARE_INFO_COMMAND (ea_backward_kill_line, + _("Kill to the beginning of the line")) +{ + if (count < 0) + ea_kill_text (input_line_point, input_line_end); + else + { + ea_kill_text (input_line_point, input_line_beg); + input_line_point = input_line_beg; + } +} + +/* Delete from point to the end of the current word. */ +DECLARE_INFO_COMMAND (ea_kill_word, _("Kill the word following the cursor")) +{ + int orig_point = input_line_point; + + if (count < 0) + ea_backward_kill_word (window, -count, key); + else + { + ea_forward_word (window, count, key); + + if (input_line_point != orig_point) + ea_kill_text (orig_point, input_line_point); + + input_line_point = orig_point; + } +} + +/* Delete from point to the start of the current word. */ +DECLARE_INFO_COMMAND (ea_backward_kill_word, + _("Kill the word preceding the cursor")) +{ + int orig_point = input_line_point; + + if (count < 0) + ea_kill_word (window, -count, key); + else + { + ea_backward_word (window, count, key); + + if (input_line_point != orig_point) + ea_kill_text (orig_point, input_line_point); + } +} + +/* The way to kill something. This appends or prepends to the last + kill, if the last command was a kill command. If FROM is less + than TO, then the killed text is appended to the most recent kill, + otherwise it is prepended. If the last command was not a kill command, + then a new slot is made for this kill. */ +static void +ea_kill_text (from, to) + int from, to; +{ + register int i, counter, distance; + int killing_backwards, slot; + char *killed_text; + + killing_backwards = (from > to); + + /* If killing backwards, reverse the values of FROM and TO. */ + if (killing_backwards) + { + int temp = from; + from = to; + to = temp; + } + + /* Remember the text that we are about to delete. */ + distance = to - from; + killed_text = (char *)xmalloc (1 + distance); + strncpy (killed_text, &input_line[from], distance); + killed_text[distance] = '\0'; + + /* Actually delete the text from the line. */ + counter = input_line_end - to; + + for (i = from; counter; i++, counter--) + input_line[i] = input_line[i + distance]; + + input_line_end -= distance; + + /* If the last command was a kill, append or prepend the killed text to + the last command's killed text. */ + if (echo_area_last_command_was_kill) + { + char *old, *new; + + slot = kill_ring_loc; + old = kill_ring[slot]; + new = (char *)xmalloc (1 + strlen (old) + strlen (killed_text)); + + if (killing_backwards) + { + /* Prepend TEXT to current kill. */ + strcpy (new, killed_text); + strcat (new, old); + } + else + { + /* Append TEXT to current kill. */ + strcpy (new, old); + strcat (new, killed_text); + } + + free (old); + free (killed_text); + kill_ring[slot] = new; + } + else + { + /* Try to store the kill in a new slot, unless that would cause there + to be too many remembered kills. */ + slot = kill_ring_index; + + if (slot == max_retained_kills) + slot = 0; + + if (slot + 1 > kill_ring_slots) + kill_ring = (char **) xrealloc + (kill_ring, + (kill_ring_slots += max_retained_kills) * sizeof (char *)); + + if (slot != kill_ring_index) + free (kill_ring[slot]); + else + kill_ring_index++; + + kill_ring[slot] = killed_text; + + kill_ring_loc = slot; + } + + /* Notice that the last command was a kill. */ + echo_area_last_command_was_kill++; +} + +/* **************************************************************** */ +/* */ +/* Echo Area Completion */ +/* */ +/* **************************************************************** */ + +/* Pointer to an array of REFERENCE to complete over. */ +static REFERENCE **echo_area_completion_items = (REFERENCE **)NULL; + +/* Sorted array of REFERENCE * which is the possible completions found in + the variable echo_area_completion_items. If there is only one element, + it is the only possible completion. */ +static REFERENCE **completions_found = (REFERENCE **)NULL; +static int completions_found_index = 0; +static int completions_found_slots = 0; + +/* The lowest common denominator found while completing. */ +static REFERENCE *LCD_completion; + +/* Internal functions used by the user calls. */ +static void build_completions (), completions_must_be_rebuilt (); + +/* Variable which holds the output of completions. */ +static NODE *possible_completions_output_node = (NODE *)NULL; + +static char *compwin_name = "*Completions*"; + +/* Return non-zero if WINDOW is a window used for completions output. */ +static int +completions_window_p (window) + WINDOW *window; +{ + int result = 0; + + if (internal_info_node_p (window->node) && + (strcmp (window->node->nodename, compwin_name) == 0)) + result = 1; + + return (result); +} + +/* Workhorse for completion readers. If FORCE is non-zero, the user cannot + exit unless the line read completes, or is empty. */ +char * +info_read_completing_internal (window, prompt, completions, force) + WINDOW *window; + char *prompt; + REFERENCE **completions; + int force; +{ + char *line; + + /* If the echo area is already active, remember the current state. */ + if (echo_area_is_active) + push_echo_area (); + + echo_area_must_complete_p = force; + + /* Initialize our local variables. */ + initialize_input_line (prompt); + + /* Initialize the echo area for the first (but maybe not the last) time. */ + echo_area_initialize_node (); + + /* Save away the original node of this window, and the window itself, + so echo area commands can temporarily use this window. */ + remember_calling_window (window); + + /* Save away the list of items to complete over. */ + echo_area_completion_items = completions; + completions_must_be_rebuilt (); + + active_window = the_echo_area; + echo_area_is_active++; + + /* Read characters in the echo area. */ + while (1) + { + info_read_and_dispatch (); + + line = echo_area_after_read (); + + /* Force the completion to take place if the user hasn't accepted + a default or aborted, and if FORCE is active. */ + if (force && line && *line && completions) + { + register int i; + + build_completions (); + + /* If there is only one completion, then make the line be that + completion. */ + if (completions_found_index == 1) + { + free (line); + line = xstrdup (completions_found[0]->label); + break; + } + + /* If one of the completions matches exactly, then that is okay, so + return the current line. */ + for (i = 0; i < completions_found_index; i++) + if (strcasecmp (completions_found[i]->label, line) == 0) + { + free (line); + line = xstrdup (completions_found[i]->label); + break; + } + + /* If no match, go back and try again. */ + if (i == completions_found_index) + { + inform_in_echo_area (_("Not complete")); + continue; + } + } + break; + } + echo_area_is_active--; + + /* Restore the original active window and show point in it. */ + active_window = calling_window; + restore_calling_window (); + display_cursor_at_point (active_window); + fflush (stdout); + + echo_area_completion_items = (REFERENCE **)NULL; + completions_must_be_rebuilt (); + + /* If there is a previous loop waiting for us, restore it now. */ + if (echo_area_is_active) + pop_echo_area (); + + return (line); +} + +/* Read a line in the echo area with completion over COMPLETIONS. */ +char * +info_read_completing_in_echo_area (window, prompt, completions) + WINDOW *window; + char *prompt; + REFERENCE **completions; +{ + return (info_read_completing_internal (window, prompt, completions, 1)); +} + +/* Read a line in the echo area allowing completion over COMPLETIONS, but + not requiring it. */ +char * +info_read_maybe_completing (window, prompt, completions) + WINDOW *window; + char *prompt; + REFERENCE **completions; +{ + return (info_read_completing_internal (window, prompt, completions, 0)); +} + +DECLARE_INFO_COMMAND (ea_possible_completions, _("List possible completions")) +{ + if (!echo_area_completion_items) + { + ea_insert (window, count, key); + return; + } + + build_completions (); + + if (!completions_found_index) + { + terminal_ring_bell (); + inform_in_echo_area (_("No completions")); + } + else if ((completions_found_index == 1) && (key != '?')) + { + inform_in_echo_area (_("Sole completion")); + } + else + { + register int i, l; + int limit, count, max_label = 0; + + initialize_message_buffer (); + printf_to_message_buffer + (_("There %s %d "), completions_found_index == 1 ? _("is") : _("are"), + completions_found_index); + printf_to_message_buffer + (_("completion%s:\n"), completions_found_index == 1 ? "" : "s"); + + /* Find the maximum length of a label. */ + for (i = 0; i < completions_found_index; i++) + { + int len = strlen (completions_found[i]->label); + if (len > max_label) + max_label = len; + } + + max_label += 4; + + /* Find out how many columns we should print in. */ + limit = calling_window->width / max_label; + if (limit != 1 && (limit * max_label == calling_window->width)) + limit--; + + /* Avoid a possible floating exception. If max_label > width then + the limit will be 0 and a divide-by-zero fault will result. */ + if (limit == 0) + limit = 1; + + /* How many iterations of the printing loop? */ + count = (completions_found_index + (limit - 1)) / limit; + + /* Watch out for special case. If the number of completions is less + than LIMIT, then just do the inner printing loop. */ + if (completions_found_index < limit) + count = 1; + + /* Print the sorted items, up-and-down alphabetically. */ + for (i = 0; i < count; i++) + { + register int j; + + for (j = 0, l = i; j < limit; j++) + { + if (l >= completions_found_index) + break; + else + { + char *label; + int printed_length, k; + + label = completions_found[l]->label; + printed_length = strlen (label); + printf_to_message_buffer ("%s", label); + + if (j + 1 < limit) + { + for (k = 0; k < max_label - printed_length; k++) + printf_to_message_buffer (" "); + } + } + l += count; + } + printf_to_message_buffer ("\n"); + } + + /* Make a new node to hold onto possible completions. Don't destroy + dangling pointers. */ + { + NODE *temp; + + temp = message_buffer_to_node (); + add_gcable_pointer (temp->contents); + name_internal_node (temp, compwin_name); + possible_completions_output_node = temp; + } + + /* Find a suitable window for displaying the completions output. + First choice is an existing window showing completions output. + If there is only one window, and it is large, make another + (smaller) window, and use that one. Otherwise, use the caller's + window. */ + { + WINDOW *compwin; + + compwin = get_internal_info_window (compwin_name); + + if (!compwin) + { + /* If we can split the window to display most of the completion + items, then do so. */ + if (calling_window->height > (count * 2) + && calling_window->height / 2 >= WINDOW_MIN_SIZE) + { + int start, pagetop; +#ifdef SPLIT_BEFORE_ACTIVE + int end; +#endif + + active_window = calling_window; + + /* Perhaps we can scroll this window on redisplay. */ + start = calling_window->first_row; + pagetop = calling_window->pagetop; + + compwin = + window_make_window (possible_completions_output_node); + active_window = the_echo_area; + window_change_window_height + (compwin, -(compwin->height - (count + 2))); + + window_adjust_pagetop (calling_window); + remember_calling_window (calling_window); + +#if defined (SPLIT_BEFORE_ACTIVE) + /* If the pagetop hasn't changed, scrolling the calling + window is a reasonable thing to do. */ + if (pagetop == calling_window->pagetop) + { + end = start + calling_window->height; + display_scroll_display + (start, end, calling_window->prev->height + 1); + } +#else /* !SPLIT_BEFORE_ACTIVE */ + /* If the pagetop has changed, set the new pagetop here. */ + if (pagetop != calling_window->pagetop) + { + int newtop = calling_window->pagetop; + calling_window->pagetop = pagetop; + set_window_pagetop (calling_window, newtop); + } +#endif /* !SPLIT_BEFORE_ACTIVE */ + + echo_area_completions_window = compwin; + remember_window_and_node (compwin, compwin->node); + } + else + compwin = calling_window; + } + + if (compwin->node != possible_completions_output_node) + { + window_set_node_of_window + (compwin, possible_completions_output_node); + remember_window_and_node (compwin, compwin->node); + } + + display_update_display (windows); + } + } +} + +DECLARE_INFO_COMMAND (ea_complete, _("Insert completion")) +{ + if (!echo_area_completion_items) + { + ea_insert (window, count, key); + return; + } + + /* If KEY is SPC, and we are not forcing completion to take place, simply + insert the key. */ + if (!echo_area_must_complete_p && key == SPC) + { + ea_insert (window, count, key); + return; + } + + if (ea_last_executed_command == ea_complete) + { + /* If the keypress is a SPC character, and we have already tried + completing once, and there are several completions, then check + the batch of completions to see if any continue with a space. + If there are some, insert the space character and continue. */ + if (key == SPC && completions_found_index > 1) + { + register int i, offset; + + offset = input_line_end - input_line_beg; + + for (i = 0; i < completions_found_index; i++) + if (completions_found[i]->label[offset] == ' ') + break; + + if (completions_found[i]) + ea_insert (window, 1, ' '); + else + { + ea_possible_completions (window, count, key); + return; + } + } + else + { + ea_possible_completions (window, count, key); + return; + } + } + + input_line_point = input_line_end; + build_completions (); + + if (!completions_found_index) + terminal_ring_bell (); + else if (LCD_completion->label[0] == '\0') + ea_possible_completions (window, count, key); + else + { + register int i; + input_line_point = input_line_end = input_line_beg; + for (i = 0; LCD_completion->label[i]; i++) + ea_insert (window, 1, LCD_completion->label[i]); + } +} + +/* Utility REFERENCE used to store possible LCD. */ +static REFERENCE LCD_reference = { (char *)NULL, (char *)NULL, (char *)NULL }; + +static void remove_completion_duplicates (); + +/* Variables which remember the state of the most recent call + to build_completions (). */ +static char *last_completion_request = (char *)NULL; +static REFERENCE **last_completion_items = (REFERENCE **)NULL; + +/* How to tell the completion builder to reset internal state. */ +static void +completions_must_be_rebuilt () +{ + maybe_free (last_completion_request); + last_completion_request = (char *)NULL; + last_completion_items = (REFERENCE **)NULL; +} + +/* Build a list of possible completions from echo_area_completion_items, + and the contents of input_line. */ +static void +build_completions () +{ + register int i, len; + register REFERENCE *entry; + char *request; + int informed_of_lengthy_job = 0; + + /* If there are no items to complete over, exit immediately. */ + if (!echo_area_completion_items) + { + completions_found_index = 0; + LCD_completion = (REFERENCE *)NULL; + return; + } + + /* Check to see if this call to build completions is the same as the last + call to build completions. */ + len = input_line_end - input_line_beg; + request = (char *)xmalloc (1 + len); + strncpy (request, &input_line[input_line_beg], len); + request[len] = '\0'; + + if (last_completion_request && last_completion_items && + last_completion_items == echo_area_completion_items && + (strcmp (last_completion_request, request) == 0)) + { + free (request); + return; + } + + maybe_free (last_completion_request); + last_completion_request = request; + last_completion_items = echo_area_completion_items; + + /* Always start at the beginning of the list. */ + completions_found_index = 0; + LCD_completion = (REFERENCE *)NULL; + + for (i = 0; (entry = echo_area_completion_items[i]); i++) + { + if (strncasecmp (request, entry->label, len) == 0) + add_pointer_to_array (entry, completions_found_index, + completions_found, completions_found_slots, + 20, REFERENCE *); + + if (!informed_of_lengthy_job && completions_found_index > 100) + { + informed_of_lengthy_job = 1; + window_message_in_echo_area (_("Building completions...")); + } + } + + if (!completions_found_index) + return; + + /* Sort and prune duplicate entries from the completions array. */ + remove_completion_duplicates (); + + /* If there is only one completion, just return that. */ + if (completions_found_index == 1) + { + LCD_completion = completions_found[0]; + return; + } + + /* Find the least common denominator. */ + { + long shortest = 100000; + + for (i = 1; i < completions_found_index; i++) + { + register int j; + int c1, c2; + + for (j = 0; + (c1 = info_tolower (completions_found[i - 1]->label[j])) && + (c2 = info_tolower (completions_found[i]->label[j])); + j++) + if (c1 != c2) + break; + + if (shortest > j) + shortest = j; + } + + maybe_free (LCD_reference.label); + LCD_reference.label = (char *)xmalloc (1 + shortest); + strncpy (LCD_reference.label, completions_found[0]->label, shortest); + LCD_reference.label[shortest] = '\0'; + LCD_completion = &LCD_reference; + } + + if (informed_of_lengthy_job) + echo_area_initialize_node (); +} + +/* Function called by qsort. */ +static int +compare_references (entry1, entry2) + REFERENCE **entry1, **entry2; +{ + return (strcasecmp ((*entry1)->label, (*entry2)->label)); +} + +/* Prune duplicate entries from COMPLETIONS_FOUND. */ +static void +remove_completion_duplicates () +{ + register int i, j; + REFERENCE **temp; + int newlen; + + if (!completions_found_index) + return; + + /* Sort the items. */ + qsort (completions_found, completions_found_index, sizeof (REFERENCE *), + compare_references); + + for (i = 0, newlen = 1; i < completions_found_index - 1; i++) + { + if (strcmp (completions_found[i]->label, + completions_found[i + 1]->label) == 0) + completions_found[i] = (REFERENCE *)NULL; + else + newlen++; + } + + /* We have marked all the dead slots. It is faster to copy the live slots + twice than to prune the dead slots one by one. */ + temp = (REFERENCE **)xmalloc ((1 + newlen) * sizeof (REFERENCE *)); + for (i = 0, j = 0; i < completions_found_index; i++) + if (completions_found[i]) + temp[j++] = completions_found[i]; + + for (i = 0; i < newlen; i++) + completions_found[i] = temp[i]; + + completions_found[i] = (REFERENCE *)NULL; + completions_found_index = newlen; + free (temp); +} + +/* Scroll the "other" window. If there is a window showing completions, scroll + that one, otherwise scroll the window which was active on entering the read + function. */ +DECLARE_INFO_COMMAND (ea_scroll_completions_window, _("Scroll the completions window")) +{ + WINDOW *compwin; + int old_pagetop; + + compwin = get_internal_info_window (compwin_name); + + if (!compwin) + compwin = calling_window; + + old_pagetop = compwin->pagetop; + + /* Let info_scroll_forward () do the work, and print any messages that + need to be displayed. */ + info_scroll_forward (compwin, count, key); +} + +/* Function which gets called when an Info window is deleted while the + echo area is active. WINDOW is the window which has just been deleted. */ +void +echo_area_inform_of_deleted_window (window) + WINDOW *window; +{ + /* If this is the calling_window, forget what we remembered about it. */ + if (window == calling_window) + { + if (active_window != the_echo_area) + remember_calling_window (active_window); + else + remember_calling_window (windows); + } + + /* If this window was the echo_area_completions_window, then notice that + the window has been deleted. */ + if (window == echo_area_completions_window) + echo_area_completions_window = (WINDOW *)NULL; +} + +/* **************************************************************** */ +/* */ +/* Pushing and Popping the Echo Area */ +/* */ +/* **************************************************************** */ + +/* Push and Pop the echo area. */ +typedef struct { + char *line; + char *prompt; + REFERENCE **comp_items; + int point, beg, end; + int must_complete; + NODE node; + WINDOW *compwin; +} PUSHED_EA; + +static PUSHED_EA **pushed_echo_areas = (PUSHED_EA **)NULL; +static int pushed_echo_areas_index = 0; +static int pushed_echo_areas_slots = 0; + +/* Pushing the echo_area has a side effect of zeroing the completion_items. */ +static void +push_echo_area () +{ + PUSHED_EA *pushed; + + pushed = (PUSHED_EA *)xmalloc (sizeof (PUSHED_EA)); + pushed->line = xstrdup (input_line); + pushed->prompt = input_line_prompt; + pushed->point = input_line_point; + pushed->beg = input_line_beg; + pushed->end = input_line_end; + pushed->node = input_line_node; + pushed->comp_items = echo_area_completion_items; + pushed->must_complete = echo_area_must_complete_p; + pushed->compwin = echo_area_completions_window; + + add_pointer_to_array (pushed, pushed_echo_areas_index, pushed_echo_areas, + pushed_echo_areas_slots, 4, PUSHED_EA *); + + echo_area_completion_items = (REFERENCE **)NULL; +} + +static void +pop_echo_area () +{ + PUSHED_EA *popped; + + popped = pushed_echo_areas[--pushed_echo_areas_index]; + + strcpy (input_line, popped->line); + free (popped->line); + input_line_prompt = popped->prompt; + input_line_point = popped->point; + input_line_beg = popped->beg; + input_line_end = popped->end; + input_line_node = popped->node; + echo_area_completion_items = popped->comp_items; + echo_area_must_complete_p = popped->must_complete; + echo_area_completions_window = popped->compwin; + completions_must_be_rebuilt (); + + /* If the completion window no longer exists, forget about it. */ + if (echo_area_completions_window) + { + register WINDOW *win; + + for (win = windows; win; win = win->next) + if (echo_area_completions_window == win) + break; + + /* If the window wasn't found, then it has already been deleted. */ + if (!win) + echo_area_completions_window = (WINDOW *)NULL; + } + + free (popped); +} + +/* Returns non-zero if any of the prior stacked calls to read in the echo + area produced a completions window. */ +static int +echo_area_stack_contains_completions_p () +{ + register int i; + + for (i = 0; i < pushed_echo_areas_index; i++) + if (pushed_echo_areas[i]->compwin) + return (1); + + return (0); +} + +/* **************************************************************** */ +/* */ +/* Error Messages While Reading in Echo Area */ +/* */ +/* **************************************************************** */ + +#if defined (HAVE_SYS_TIME_H) +# include <sys/time.h> +# define HAVE_STRUCT_TIMEVAL +#endif /* HAVE_SYS_TIME_H */ + +static void +pause_or_input () +{ +#if defined (FD_SET) + struct timeval timer; + fd_set readfds; + int ready; + + FD_ZERO (&readfds); + FD_SET (fileno (stdin), &readfds); + timer.tv_sec = 2; + timer.tv_usec = 750; + ready = select (fileno (stdin) + 1, &readfds, (fd_set *) NULL, + (fd_set *) NULL, &timer); +#endif /* FD_SET */ +} + +/* Print MESSAGE right after the end of the current line, and wait + for input or 2.75 seconds, whichever comes first. Then flush the + informational message that was printed. */ +void +inform_in_echo_area (message) + char *message; +{ + register int i; + char *text; + + text = xstrdup (message); + for (i = 0; text[i] && text[i] != '\n'; i++); + text[i] = '\0'; + + echo_area_initialize_node (); + sprintf (&input_line[input_line_end], "%s[%s]\n", + echo_area_is_active ? " ": "", text); + free (text); + the_echo_area->point = input_line_point; + display_update_one_window (the_echo_area); + display_cursor_at_point (active_window); + fflush (stdout); + pause_or_input (); + echo_area_initialize_node (); +} diff --git a/gnu/usr.bin/texinfo/info/echo-area.h b/gnu/usr.bin/texinfo/info/echo-area.h new file mode 100644 index 00000000000..e794d596a4d --- /dev/null +++ b/gnu/usr.bin/texinfo/info/echo-area.h @@ -0,0 +1,64 @@ +/* echo-area.h -- Functions used in reading information from the echo area. + $Id: echo-area.h,v 1.1 1997/08/01 22:00:08 kstailey Exp $ + + This file is part of GNU Info, a program for reading online documentation + stored in Info format. + + Copyright (C) 1993, 97 Free Software Foundation, Inc. + + 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. + + Written by Brian Fox (bfox@ai.mit.edu). */ + +#ifndef INFO_ECHO_AREA_H +#define INFO_ECHO_AREA_H + +#define EA_MAX_INPUT 256 + +extern int echo_area_is_active, info_aborted_echo_area; + +/* Non-zero means that the last command executed while reading input + killed some text. */ +extern int echo_area_last_command_was_kill; + +extern void inform_in_echo_area (), echo_area_inform_of_deleted_window (); +extern void echo_area_prep_read (); +extern VFunction *ea_last_executed_command; + +/* Read a line of text in the echo area. Return a malloc ()'ed string, + or NULL if the user aborted out of this read. WINDOW is the currently + active window, so that we can restore it when we need to. PROMPT, if + non-null, is a prompt to print before reading the line. */ +extern char *info_read_in_echo_area (); + +/* Read a line in the echo area with completion over COMPLETIONS. + Takes arguments of WINDOW, PROMPT, and COMPLETIONS, a REFERENCE **. */ +char *info_read_completing_in_echo_area (); + +/* Read a line in the echo area allowing completion over COMPLETIONS, but + not requiring it. Takes arguments of WINDOW, PROMPT, and COMPLETIONS, + a REFERENCE **. */ +extern char *info_read_maybe_completing (); + +extern void ea_insert (), ea_quoted_insert (); +extern void ea_beg_of_line (), ea_backward (), ea_delete (), ea_end_of_line (); +extern void ea_forward (), ea_abort (), ea_rubout (), ea_complete (); +extern void ea_newline (), ea_kill_line (), ea_transpose_chars (); +extern void ea_yank (), ea_tab_insert (), ea_possible_completions (); +extern void ea_backward_word (), ea_kill_word (), ea_forward_word (); +extern void ea_yank_pop (), ea_backward_kill_word (); +extern void ea_scroll_completions_window (); + +#endif /* not INFO_ECHO_AREA_H */ diff --git a/gnu/usr.bin/texinfo/info/funs.h b/gnu/usr.bin/texinfo/info/funs.h new file mode 100644 index 00000000000..45fcb6ae274 --- /dev/null +++ b/gnu/usr.bin/texinfo/info/funs.h @@ -0,0 +1,111 @@ +/* funs.h -- Generated declarations for Info commands. */ + +/* Functions declared in "./session.c". */ +extern void info_next_line (); +extern void info_prev_line (); +extern void info_end_of_line (); +extern void info_beginning_of_line (); +extern void info_forward_char (); +extern void info_backward_char (); +extern void info_forward_word (); +extern void info_backward_word (); +extern void info_global_next_node (); +extern void info_global_prev_node (); +extern void info_scroll_forward (); +extern void info_scroll_backward (); +extern void info_beginning_of_node (); +extern void info_end_of_node (); +extern void info_next_window (); +extern void info_prev_window (); +extern void info_split_window (); +extern void info_delete_window (); +extern void info_keep_one_window (); +extern void info_scroll_other_window (); +extern void info_grow_window (); +extern void info_tile_windows (); +extern void info_toggle_wrap (); +extern void info_next_node (); +extern void info_prev_node (); +extern void info_up_node (); +extern void info_last_node (); +extern void info_first_node (); +extern void info_history_node (); +extern void info_last_menu_item (); +extern void info_menu_digit (); +extern void info_menu_item (); +extern void info_xref_item (); +extern void info_find_menu (); +extern void info_visit_menu (); +extern void info_goto_node (); +extern void info_man (); +extern void info_top_node (); +extern void info_dir_node (); +extern void info_kill_node (); +extern void info_view_file (); +extern void info_print_node (); +extern void info_search (); +extern void isearch_forward (); +extern void isearch_backward (); +extern void info_move_to_prev_xref (); +extern void info_move_to_next_xref (); +extern void info_select_reference_this_line (); +extern void info_abort_key (); +extern void info_move_to_window_line (); +extern void info_redraw_display (); +extern void info_quit (); +extern void info_do_lowercase_version (); +extern void info_add_digit_to_numeric_arg (); +extern void info_universal_argument (); +extern void info_numeric_arg_digit_loop (); + +/* Functions declared in "./echo-area.c". */ +extern void ea_forward (); +extern void ea_backward (); +extern void ea_beg_of_line (); +extern void ea_end_of_line (); +extern void ea_forward_word (); +extern void ea_backward_word (); +extern void ea_delete (); +extern void ea_rubout (); +extern void ea_abort (); +extern void ea_newline (); +extern void ea_quoted_insert (); +extern void ea_insert (); +extern void ea_tab_insert (); +extern void ea_transpose_chars (); +extern void ea_yank (); +extern void ea_yank_pop (); +extern void ea_kill_line (); +extern void ea_backward_kill_line (); +extern void ea_kill_word (); +extern void ea_backward_kill_word (); +extern void ea_possible_completions (); +extern void ea_complete (); +extern void ea_scroll_completions_window (); + +/* Functions declared in "./infodoc.c". */ +extern void info_get_help_window (); +extern void info_get_info_help_node (); +extern void describe_key (); +extern void info_where_is (); + +/* Functions declared in "./m-x.c". */ +extern void describe_command (); +extern void info_execute_command (); +extern void set_screen_height (); + +/* Functions declared in "./indices.c". */ +extern void info_index_search (); +extern void info_next_index_match (); +extern void info_index_apropos (); + +/* Functions declared in "./nodemenu.c". */ +extern void list_visited_nodes (); +extern void select_visited_node (); + +/* Functions declared in "./footnotes.c". */ +extern void info_show_footnotes (); + +/* Functions declared in "./variables.c". */ +extern void describe_variable (); +extern void set_variable (); diff --git a/gnu/usr.bin/texinfo/info/gc.c b/gnu/usr.bin/texinfo/info/gc.c index 3b9b0907f51..1c868ba3284 100644 --- a/gnu/usr.bin/texinfo/info/gc.c +++ b/gnu/usr.bin/texinfo/info/gc.c @@ -56,7 +56,7 @@ gc_pointers () if (!info_windows || !gcable_pointers_index) return; - for (i = 0; iw = info_windows[i]; i++) + for (i = 0; (iw = info_windows[i]); i++) { for (j = 0; j < iw->nodes_index; j++) { diff --git a/gnu/usr.bin/texinfo/info/info-utils.c b/gnu/usr.bin/texinfo/info/info-utils.c index 6af3dd0e2ca..d9ab9a0634b 100644 --- a/gnu/usr.bin/texinfo/info/info-utils.c +++ b/gnu/usr.bin/texinfo/info/info-utils.c @@ -21,15 +21,8 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#include <stdio.h> /* For "NULL". Yechhh! */ -#include <ctype.h> -#include <sys/types.h> -#include <sys/stat.h> -#if defined (HAVE_STRING_H) -# include <string.h> -#endif /* HAVE_STRING_H */ +#include "info.h" #include "info-utils.h" - #if defined (HANDLE_MAN_PAGES) # include "man.h" #endif /* HANDLE_MAN_PAGES */ @@ -84,7 +77,7 @@ info_parse_node (string, newlines_okay) /* Find the closing paren. */ while (string[i] && string[i] != ')') - i++; + i++; /* Remember parsed filename. */ saven_filename (string, i); @@ -93,7 +86,7 @@ info_parse_node (string, newlines_okay) string += i; if (*string) - string++; + string++; } /* Parse out nodename. */ @@ -136,9 +129,9 @@ info_parse_label (label, node) } /* **************************************************************** */ -/* */ -/* Finding and Building Menus */ -/* */ +/* */ +/* Finding and Building Menus */ +/* */ /* **************************************************************** */ /* Return a NULL terminated array of REFERENCE * which represents the menu @@ -246,23 +239,23 @@ info_references_internal (label, binding) offset = string_in_line (":", refdef); /* When searching for menu items, if no colon, there is no - menu item on this line. */ + menu item on this line. */ if (offset == -1) - { - if (searching_for_menu_items) - continue; - else - { - int temp; - - temp = skip_line (refdef); - offset = string_in_line (":", refdef + temp); - if (offset == -1) - continue; /* Give up? */ - else - offset += temp; - } - } + { + if (searching_for_menu_items) + continue; + else + { + int temp; + + temp = skip_line (refdef); + offset = string_in_line (":", refdef + temp); + if (offset == -1) + continue; /* Give up? */ + else + offset += temp; + } + } entry = (REFERENCE *)xmalloc (sizeof (REFERENCE)); entry->filename = (char *)NULL; @@ -277,32 +270,32 @@ info_references_internal (label, binding) entry->end = refdef - binding->buffer; /* If this reference entry continues with another ':' then the - nodename is the same as the label. */ + nodename is the same as the label. */ if (*refdef == ':') - { - entry->nodename = strdup (entry->label); - } + { + entry->nodename = xstrdup (entry->label); + } else - { - /* This entry continues with a specific nodename. Parse the - nodename from the specification. */ + { + /* This entry continues with a specific nodename. Parse the + nodename from the specification. */ - refdef += skip_whitespace_and_newlines (refdef); + refdef += skip_whitespace_and_newlines (refdef); - if (searching_for_menu_items) - info_parse_node (refdef, DONT_SKIP_NEWLINES); - else - info_parse_node (refdef, SKIP_NEWLINES); + if (searching_for_menu_items) + info_parse_node (refdef, DONT_SKIP_NEWLINES); + else + info_parse_node (refdef, SKIP_NEWLINES); - if (info_parsed_filename) - entry->filename = strdup (info_parsed_filename); + if (info_parsed_filename) + entry->filename = xstrdup (info_parsed_filename); - if (info_parsed_nodename) - entry->nodename = strdup (info_parsed_nodename); - } + if (info_parsed_nodename) + entry->nodename = xstrdup (info_parsed_nodename); + } add_pointer_to_array - (entry, refs_index, refs, refs_slots, 50, REFERENCE *); + (entry, refs_index, refs, refs_slots, 50, REFERENCE *); } return (refs); } @@ -320,7 +313,7 @@ info_get_labeled_reference (label, references) for (i = 0; references && (entry = references[i]); i++) { if (strcmp (label, entry->label) == 0) - return (entry); + return (entry); } return ((REFERENCE *)NULL); } @@ -375,13 +368,13 @@ info_free_references (references) if (references) { for (i = 0; references && (entry = references[i]); i++) - { - maybe_free (entry->label); - maybe_free (entry->filename); - maybe_free (entry->nodename); + { + maybe_free (entry->label); + maybe_free (entry->filename); + maybe_free (entry->nodename); - free (entry); - } + free (entry); + } free (references); } @@ -411,24 +404,24 @@ canonicalize_whitespace (string) for (i = 0, j = 0; string[i]; i++) { if (whitespace_or_newline (string[i])) - { - whitespace_found++; - whitespace_loc = i; - continue; - } + { + whitespace_found++; + whitespace_loc = i; + continue; + } else - { - if (whitespace_found && whitespace_loc) - { - whitespace_found = 0; - - /* Suppress whitespace at start of string. */ - if (j) - temp[j++] = ' '; - } - - temp[j++] = string[i]; - } + { + if (whitespace_found && whitespace_loc) + { + whitespace_found = 0; + + /* Suppress whitespace at start of string. */ + if (j) + temp[j++] = ' '; + } + + temp[j++] = string[i]; + } } /* Kill trailing whitespace. */ @@ -466,26 +459,26 @@ printed_representation (character, hpos) else if (iscntrl (character)) { switch (character) - { - case '\r': - case '\n': - the_rep[i++] = character; - break; - - case '\t': - { - int tw; - - tw = ((hpos + 8) & 0xf8) - hpos; - while (i < tw) - the_rep[i++] = ' '; - } - break; - - default: - the_rep[i++] = '^'; - the_rep[i++] = (character | 0x40); - } + { + case '\r': + case '\n': + the_rep[i++] = character; + break; + + case '\t': + { + int tw; + + tw = ((hpos + 8) & 0xf8) - hpos; + while (i < tw) + the_rep[i++] = ' '; + } + break; + + default: + the_rep[i++] = '^'; + the_rep[i++] = (character | 0x40); + } } else if (character > printable_limit) { @@ -502,9 +495,9 @@ printed_representation (character, hpos) /* **************************************************************** */ -/* */ -/* Functions Static To This File */ -/* */ +/* */ +/* Functions Static To This File */ +/* */ /* **************************************************************** */ /* Amount of space allocated to INFO_PARSED_FILENAME via xmalloc (). */ @@ -531,7 +524,7 @@ saven_filename (filename, len) int len; { saven_string (filename, len, - &info_parsed_filename, &parsed_filename_size); + &info_parsed_filename, &parsed_filename_size); } /* Remember NODENAME in PARSED_NODENAME. An empty NODENAME is translated @@ -550,7 +543,7 @@ saven_nodename (nodename, len) int len; { saven_string (nodename, len, - &info_parsed_nodename, &parsed_nodename_size); + &info_parsed_nodename, &parsed_nodename_size); } /* Remember STRING in STRING_P. STRING_P should currently have STRING_SIZE_P @@ -565,7 +558,7 @@ save_string (string, string_p, string_size_p) if (!string || !*string) { if (*string_p) - free (*string_p); + free (*string_p); *string_p = (char *)NULL; *string_size_p = 0; @@ -573,8 +566,8 @@ save_string (string, string_p, string_size_p) else { if (strlen (string) >= *string_size_p) - *string_p = (char *)xrealloc - (*string_p, (*string_size_p = 1 + strlen (string))); + *string_p = (char *)xrealloc + (*string_p, (*string_size_p = 1 + strlen (string))); strcpy (*string_p, string); } @@ -591,7 +584,7 @@ saven_string (string, len, string_p, string_size_p) if (!string) { if (*string_p) - free (*string_p); + free (*string_p); *string_p = (char *)NULL; *string_size_p = 0; @@ -599,7 +592,7 @@ saven_string (string, len, string_p, string_size_p) else { if (len >= *string_size_p) - *string_p = (char *)xrealloc (*string_p, (*string_size_p = 1 + len)); + *string_p = (char *)xrealloc (*string_p, (*string_size_p = 1 + len)); strncpy (*string_p, string, len); (*string_p)[len] = '\0'; @@ -665,7 +658,7 @@ get_internal_info_window (name) for (win = windows; win; win = win->next) if (internal_info_node_p (win->node) && - (strcmp (win->node->nodename, name) == 0)) + (strcmp (win->node->nodename, name) == 0)) break; return (win); diff --git a/gnu/usr.bin/texinfo/info/infomap.h b/gnu/usr.bin/texinfo/info/infomap.h index faf93884fd5..65968cbdff4 100644 --- a/gnu/usr.bin/texinfo/info/infomap.h +++ b/gnu/usr.bin/texinfo/info/infomap.h @@ -21,14 +21,14 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#if !defined (_INFOMAP_H_) -#define _INFOMAP_H_ +#ifndef INFOMAP_H +#define INFOMAP_H -#include "general.h" +#include "info.h" #define ESC '\033' #define DEL '\177' -#define TAB '\011' +#define TAB '\011' #define RET '\r' #define LFD '\n' #define SPC ' ' @@ -79,4 +79,4 @@ extern void keymap_discard_keymap (); /* Initialize the info keymaps. */ extern void initialize_info_keymaps (); -#endif /* !_INFOMAP_H_ */ +#endif /* not INFOMAP_H */ diff --git a/gnu/usr.bin/texinfo/info/nodes.c b/gnu/usr.bin/texinfo/info/nodes.c index 8995c78195f..f2737e7b354 100644 --- a/gnu/usr.bin/texinfo/info/nodes.c +++ b/gnu/usr.bin/texinfo/info/nodes.c @@ -21,17 +21,8 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#include <stdio.h> -#include <ctype.h> -#include <sys/types.h> -#if defined (HAVE_SYS_FILE_H) -#include <sys/file.h> -#endif /* HAVE_SYS_FILE_H */ -#include <sys/errno.h> -#include <sys/stat.h> -#if defined (HAVE_STRING_H) -#include <string.h> -#endif /* HAVE_STRING_H */ +#include "info.h" + #include "nodes.h" #include "search.h" #include "filesys.h" @@ -41,22 +32,10 @@ # include "man.h" #endif /* HANDLE_MAN_PAGES */ -#if !defined (O_RDONLY) -#if defined (HAVE_SYS_FCNTL_H) -#include <sys/fcntl.h> -#else /* !HAVE_SYS_FCNTL_H */ -#include <fcntl.h> -#endif /* !HAVE_SYS_FCNTL_H */ -#endif /* !O_RDONLY */ - -#if !defined (errno) -extern int errno; -#endif /* !errno */ - /* **************************************************************** */ -/* */ -/* Functions Static to this File */ -/* */ +/* */ +/* Functions Static to this File */ +/* */ /* **************************************************************** */ static void forget_info_file (), remember_info_file (); @@ -81,9 +60,9 @@ static long get_node_length (); #define INFO_GET_TAGS 1 /* **************************************************************** */ -/* */ -/* Global Variables */ -/* */ +/* */ +/* Global Variables */ +/* */ /* **************************************************************** */ /* When non-zero, this is a string describing the recent file error. */ @@ -96,9 +75,9 @@ FILE_BUFFER **info_loaded_files = (FILE_BUFFER **)NULL; int info_loaded_files_slots = 0; /* **************************************************************** */ -/* */ -/* Public Functions for Node Manipulation */ -/* */ +/* */ +/* Public Functions for Node Manipulation */ +/* */ /* **************************************************************** */ /* Used to build "dir" menu from "localdir" files found in INFOPATH. */ @@ -142,8 +121,8 @@ info_get_node (filename, nodename) if (!file_buffer) { if (filesys_error_number) - info_recent_file_error = - filesys_error_string (filename, filesys_error_number); + info_recent_file_error = + filesys_error_string (filename, filesys_error_number); return ((NODE *)NULL); } @@ -154,9 +133,9 @@ info_get_node (filename, nodename) { node = info_get_node_of_file_buffer ("Top", file_buffer); if (!node) - node = info_get_node_of_file_buffer ("top", file_buffer); + node = info_get_node_of_file_buffer ("top", file_buffer); if (!node) - node = info_get_node_of_file_buffer ("TOP", file_buffer); + node = info_get_node_of_file_buffer ("TOP", file_buffer); } return (node); } @@ -193,7 +172,7 @@ info_get_node_of_file_buffer (nodename, file_buffer) node = (NODE *)xmalloc (sizeof (NODE)); node->filename = file_buffer->fullpath; node->parent = (char *)NULL; - node->nodename = strdup ("*"); + node->nodename = xstrdup ("*"); node->contents = file_buffer->contents; node->nodelen = file_buffer->filesize; node->flags = 0; @@ -203,7 +182,7 @@ info_get_node_of_file_buffer (nodename, file_buffer) the manpage node finding function instead. */ else if (file_buffer->flags & N_IsManPage) { - node = get_manpage_node (file_buffer, nodename); + node = get_manpage_node (file_buffer, nodename); } #endif /* HANDLE_MAN_PAGES */ /* If this is the "main" info file, it might contain a tags table. Search @@ -242,9 +221,9 @@ info_load_file (filename) /* **************************************************************** */ -/* */ -/* Private Functions Implementation */ -/* */ +/* */ +/* Private Functions Implementation */ +/* */ /* **************************************************************** */ /* The workhorse for info_find_file (). Non-zero 2nd argument says to @@ -263,58 +242,58 @@ info_find_file_internal (filename, get_tags) /* First try to find the file in our list of already loaded files. */ if (info_loaded_files) { - for (i = 0; file_buffer = info_loaded_files[i]; i++) - if ((strcmp (filename, file_buffer->filename) == 0) || - (strcmp (filename, file_buffer->fullpath) == 0) || - ((*filename != '/') && - strcmp (filename, - filename_non_directory (file_buffer->fullpath)) == 0)) - { - struct stat new_info, *old_info; - - /* This file is loaded. If the filename that we want is - specifically "dir", then simply return the file buffer. */ - if (strcasecmp (filename_non_directory (filename), "dir") == 0) - return (file_buffer); + for (i = 0; (file_buffer = info_loaded_files[i]); i++) + if ((strcmp (filename, file_buffer->filename) == 0) || + (strcmp (filename, file_buffer->fullpath) == 0) || + ((*filename != '/') && + strcmp (filename, + filename_non_directory (file_buffer->fullpath)) == 0)) + { + struct stat new_info, *old_info; + + /* This file is loaded. If the filename that we want is + specifically "dir", then simply return the file buffer. */ + if (strcasecmp (filename_non_directory (filename), "dir") == 0) + return (file_buffer); #if defined (HANDLE_MAN_PAGES) - /* Do the same for the magic MANPAGE file. */ - if (file_buffer->flags & N_IsManPage) - return (file_buffer); + /* Do the same for the magic MANPAGE file. */ + if (file_buffer->flags & N_IsManPage) + return (file_buffer); #endif /* HANDLE_MAN_PAGES */ - /* The file appears to be already loaded, and it is not "dir". - Check to see if it has changed since the last time it was - loaded. */ - if (stat (file_buffer->fullpath, &new_info) == -1) - { - filesys_error_number = errno; - return ((FILE_BUFFER *)NULL); - } - - old_info = &file_buffer->finfo; - - if ((new_info.st_size != old_info->st_size) || - (new_info.st_mtime != old_info->st_mtime)) - { - /* The file has changed. Forget that we ever had loaded it - in the first place. */ - forget_info_file (filename); - break; - } - else - { - /* The info file exists, and has not changed since the last - time it was loaded. If the caller requested a nodes list - for this file, and there isn't one here, build the nodes - for this file_buffer. In any case, return the file_buffer - object. */ - if (get_tags && !file_buffer->tags) - build_tags_and_nodes (file_buffer); - - return (file_buffer); - } - } + /* The file appears to be already loaded, and it is not "dir". + Check to see if it has changed since the last time it was + loaded. */ + if (stat (file_buffer->fullpath, &new_info) == -1) + { + filesys_error_number = errno; + return ((FILE_BUFFER *)NULL); + } + + old_info = &file_buffer->finfo; + + if ((new_info.st_size != old_info->st_size) || + (new_info.st_mtime != old_info->st_mtime)) + { + /* The file has changed. Forget that we ever had loaded it + in the first place. */ + forget_info_file (filename); + break; + } + else + { + /* The info file exists, and has not changed since the last + time it was loaded. If the caller requested a nodes list + for this file, and there isn't one here, build the nodes + for this file_buffer. In any case, return the file_buffer + object. */ + if (get_tags && !file_buffer->tags) + build_tags_and_nodes (file_buffer); + + return (file_buffer); + } + } } /* The file wasn't loaded. Try to load it now. */ @@ -364,21 +343,21 @@ info_load_file_internal (filename, get_tags) char *lowered_name; char *basename; - lowered_name = strdup (filename); + lowered_name = xstrdup (filename); basename = (char *) strrchr (lowered_name, '/'); if (basename) - basename++; + basename++; else - basename = lowered_name; + basename = lowered_name; while (*basename) - { - if (isupper (*basename)) - *basename = tolower (*basename); + { + if (isupper (*basename)) + *basename = tolower (*basename); - basename++; - } + basename++; + } fullpath = info_find_fullpath (lowered_name); free (lowered_name); @@ -402,8 +381,8 @@ info_load_file_internal (filename, get_tags) /* The file was found, and can be read. Allocate FILE_BUFFER and fill in the various members. */ file_buffer = make_file_buffer (); - file_buffer->filename = strdup (filename); - file_buffer->fullpath = strdup (fullpath); + file_buffer->filename = xstrdup (filename); + file_buffer->fullpath = xstrdup (fullpath); file_buffer->finfo = finfo; file_buffer->filesize = filesize; file_buffer->contents = contents; @@ -444,81 +423,81 @@ build_tags_and_nodes (file_buffer) if (position != -1) while (1) { - long tags_table_begin, tags_table_end; - - binding.end = position; - binding.start = binding.end - 5 - strlen (TAGS_TABLE_END_LABEL); - if (binding.start < 0) - binding.start = 0; - - position = find_node_separator (&binding); - - /* For this test, (and all others here) failure indicates a bogus - tags table. Grovel the file. */ - if (position == -1) - break; - - /* Remember the end of the tags table. */ - binding.start = position; - tags_table_end = binding.start; - binding.end = 0; - - /* Locate the start of the tags table. */ - position = search_backward (TAGS_TABLE_BEG_LABEL, &binding); - - if (position == -1) - break; - - binding.end = position; - binding.start = binding.end - 5 - strlen (TAGS_TABLE_BEG_LABEL); - position = find_node_separator (&binding); - - if (position == -1) - break; - - /* The file contains a valid tags table. Fill the FILE_BUFFER's - tags member. */ - file_buffer->flags |= N_HasTagsTable; - tags_table_begin = position; - - /* If this isn't an indirect tags table, just remember the nodes - described locally in this tags table. Note that binding.end - is pointing to just after the beginning label. */ - binding.start = binding.end; - binding.end = file_buffer->filesize; - - if (!looking_at (TAGS_TABLE_IS_INDIRECT_LABEL, &binding)) - { - binding.start = tags_table_begin; - binding.end = tags_table_end; - get_nodes_of_tags_table (file_buffer, &binding); - return; - } - else - { - /* This is an indirect tags table. Build TAGS member. */ - SEARCH_BINDING indirect; - - indirect.start = tags_table_begin; - indirect.end = 0; - indirect.buffer = binding.buffer; - indirect.flags = S_FoldCase; - - position = search_backward (INDIRECT_TAGS_TABLE_LABEL, &indirect); - - if (position == -1) - { - /* This file is malformed. Give up. */ - return; - } - - indirect.start = position; - indirect.end = tags_table_begin; - binding.start = tags_table_begin; - binding.end = tags_table_end; - get_tags_of_indirect_tags_table (file_buffer, &indirect, &binding); - return; - } + long tags_table_begin, tags_table_end; + + binding.end = position; + binding.start = binding.end - 5 - strlen (TAGS_TABLE_END_LABEL); + if (binding.start < 0) + binding.start = 0; + + position = find_node_separator (&binding); + + /* For this test, (and all others here) failure indicates a bogus + tags table. Grovel the file. */ + if (position == -1) + break; + + /* Remember the end of the tags table. */ + binding.start = position; + tags_table_end = binding.start; + binding.end = 0; + + /* Locate the start of the tags table. */ + position = search_backward (TAGS_TABLE_BEG_LABEL, &binding); + + if (position == -1) + break; + + binding.end = position; + binding.start = binding.end - 5 - strlen (TAGS_TABLE_BEG_LABEL); + position = find_node_separator (&binding); + + if (position == -1) + break; + + /* The file contains a valid tags table. Fill the FILE_BUFFER's + tags member. */ + file_buffer->flags |= N_HasTagsTable; + tags_table_begin = position; + + /* If this isn't an indirect tags table, just remember the nodes + described locally in this tags table. Note that binding.end + is pointing to just after the beginning label. */ + binding.start = binding.end; + binding.end = file_buffer->filesize; + + if (!looking_at (TAGS_TABLE_IS_INDIRECT_LABEL, &binding)) + { + binding.start = tags_table_begin; + binding.end = tags_table_end; + get_nodes_of_tags_table (file_buffer, &binding); + return; + } + else + { + /* This is an indirect tags table. Build TAGS member. */ + SEARCH_BINDING indirect; + + indirect.start = tags_table_begin; + indirect.end = 0; + indirect.buffer = binding.buffer; + indirect.flags = S_FoldCase; + + position = search_backward (INDIRECT_TAGS_TABLE_LABEL, &indirect); + + if (position == -1) + { + /* This file is malformed. Give up. */ + return; + } + + indirect.start = position; + indirect.end = tags_table_begin; + binding.start = tags_table_begin; + binding.end = tags_table_end; + get_tags_of_indirect_tags_table (file_buffer, &indirect, &binding); + return; + } } /* This file doesn't contain any kind of tags table. Grovel the @@ -561,37 +540,37 @@ get_nodes_of_info_file (file_buffer) /* If not there, this is not the start of a node. */ if (start == -1) - continue; + continue; /* Find the start of the nodename. */ start += skip_whitespace (nodeline + start); /* Find the end of the nodename. */ end = start + - skip_node_characters (nodeline + start, DONT_SKIP_NEWLINES); + skip_node_characters (nodeline + start, DONT_SKIP_NEWLINES); /* Okay, we have isolated the node name, and we know where the - node starts. Remember this information in a NODE structure. */ + node starts. Remember this information in a NODE structure. */ entry = (TAG *)xmalloc (sizeof (TAG)); entry->nodename = (char *)xmalloc (1 + (end - start)); strncpy (entry->nodename, nodeline + start, end - start); entry->nodename[end - start] = '\0'; entry->nodestart = nodestart; { - SEARCH_BINDING node_body; + SEARCH_BINDING node_body; - node_body.buffer = binding.buffer + binding.start; - node_body.start = 0; - node_body.end = binding.end - binding.start; - node_body.flags = S_FoldCase; - entry->nodelen = get_node_length (&node_body); + node_body.buffer = binding.buffer + binding.start; + node_body.start = 0; + node_body.end = binding.end - binding.start; + node_body.flags = S_FoldCase; + entry->nodelen = get_node_length (&node_body); } entry->filename = file_buffer->fullpath; /* Add this tag to the array of tag structures in this FILE_BUFFER. */ add_pointer_to_array (entry, tags_index, file_buffer->tags, - file_buffer->tags_slots, 100, TAG *); + file_buffer->tags_slots, 100, TAG *); } } @@ -608,7 +587,7 @@ get_node_length (binding) for (i = binding->start, body = binding->buffer; i < binding->end; i++) { if (body[i] == INFO_FF || body[i] == INFO_COOKIE) - break; + break; } return ((long) i - binding->start); } @@ -652,16 +631,16 @@ get_nodes_of_tags_table (file_buffer, buffer_binding) /* Skip past informative "(Indirect)" tags table line. */ if (!tags_index && looking_at (TAGS_TABLE_IS_INDIRECT_LABEL, search)) - continue; + continue; /* Find the label preceding the node name. */ offset = - string_in_line (INFO_NODE_LABEL, search->buffer + search->start); + string_in_line (INFO_NODE_LABEL, search->buffer + search->start); /* If not there, not a defining line, so we must be out of the - tags table. */ + tags table. */ if (offset == -1) - break; + break; /* Point to the beginning of the node definition. */ search->start += offset; @@ -670,11 +649,11 @@ get_nodes_of_tags_table (file_buffer, buffer_binding) /* Move past the node's name. */ for (offset = 0; - (nodedef[offset]) && (nodedef[offset] != INFO_TAGSEP); - offset++); + (nodedef[offset]) && (nodedef[offset] != INFO_TAGSEP); + offset++); if (nodedef[offset] != INFO_TAGSEP) - continue; + continue; entry = (TAG *)xmalloc (sizeof (TAG)); entry->nodename = (char *)xmalloc (1 + offset); @@ -687,13 +666,13 @@ get_nodes_of_tags_table (file_buffer, buffer_binding) entry->nodelen = -1; /* The filename of this node is currently known as the same as the - name of this file. */ + name of this file. */ entry->filename = file_buffer->fullpath; /* Add this node structure to the array of node structures in this - FILE_BUFFER. */ + FILE_BUFFER. */ add_pointer_to_array (entry, tags_index, file_buffer->tags, - file_buffer->tags_slots, 100, TAG *); + file_buffer->tags_slots, 100, TAG *); } free (search); } @@ -734,23 +713,23 @@ get_tags_of_indirect_tags_table (file_buffer, indirect_binding, tags_binding) while (line < end) { - int colon; + int colon; - colon = string_in_line (":", line); + colon = string_in_line (":", line); - if (colon == -1) - break; + if (colon == -1) + break; - subfile = (SUBFILE *)xmalloc (sizeof (SUBFILE)); - subfile->filename = (char *)xmalloc (colon); - strncpy (subfile->filename, line, colon - 1); - subfile->filename[colon - 1] = '\0'; - subfile->first_byte = (long) atol (line + colon); + subfile = (SUBFILE *)xmalloc (sizeof (SUBFILE)); + subfile->filename = (char *)xmalloc (colon); + strncpy (subfile->filename, line, colon - 1); + subfile->filename[colon - 1] = '\0'; + subfile->first_byte = (long) atol (line + colon); - add_pointer_to_array - (subfile, subfiles_index, subfiles, subfiles_slots, 10, SUBFILE *); + add_pointer_to_array + (subfile, subfiles_index, subfiles, subfiles_slots, 10, SUBFILE *); - while (*line++ != '\n'); + while (*line++ != '\n'); } } @@ -768,10 +747,10 @@ get_tags_of_indirect_tags_table (file_buffer, indirect_binding, tags_binding) SEARCH_BINDING binding; /* Find the length of the header of the file containing the indirect - tags table. This header appears at the start of every file. We - want the absolute position of each node within each subfile, so - we subtract the start of the containing subfile from the logical - position of the node, and then add the length of the header in. */ + tags table. This header appears at the start of every file. We + want the absolute position of each node within each subfile, so + we subtract the start of the containing subfile from the logical + position of the node, and then add the length of the header in. */ binding.buffer = file_buffer->contents; binding.start = 0; binding.end = file_buffer->filesize; @@ -779,81 +758,80 @@ get_tags_of_indirect_tags_table (file_buffer, indirect_binding, tags_binding) header_length = find_node_separator (&binding); if (header_length == -1) - header_length = 0; + header_length = 0; /* Build the file buffer's list of subfiles. */ { - char *containing_dir, *temp; - int len_containing_dir; + char *containing_dir, *temp; + int len_containing_dir; - containing_dir = strdup (file_buffer->fullpath); - temp = (char *) strrchr (containing_dir, '/'); + containing_dir = xstrdup (file_buffer->fullpath); + temp = (char *) strrchr (containing_dir, '/'); - if (temp) - *temp = '\0'; + if (temp) + *temp = '\0'; - len_containing_dir = strlen (containing_dir); + len_containing_dir = strlen (containing_dir); - for (i = 0; subfiles[i]; i++); + for (i = 0; subfiles[i]; i++); - file_buffer->subfiles = (char **) xmalloc ((1 + i) * sizeof (char *)); + file_buffer->subfiles = (char **) xmalloc ((1 + i) * sizeof (char *)); - for (i = 0; subfiles[i]; i++) - { - char *fullpath; + for (i = 0; subfiles[i]; i++) + { + char *fullpath; - fullpath = (char *) xmalloc - (2 + strlen (subfiles[i]->filename) + len_containing_dir); + fullpath = (char *) xmalloc + (2 + strlen (subfiles[i]->filename) + len_containing_dir); - sprintf (fullpath, "%s/%s", - containing_dir, subfiles[i]->filename); + sprintf (fullpath, "%s/%s", + containing_dir, subfiles[i]->filename); - file_buffer->subfiles[i] = fullpath; - } - file_buffer->subfiles[i] = (char *)NULL; - free (containing_dir); + file_buffer->subfiles[i] = fullpath; + } + file_buffer->subfiles[i] = (char *)NULL; + free (containing_dir); } /* For each node in the file's tags table, remember the starting - position. */ - for (tags_index = 0; - entry = file_buffer->tags[tags_index]; - tags_index++) - { - for (i = 0; - subfiles[i] && entry->nodestart >= subfiles[i]->first_byte; - i++); - - /* If the Info file containing the indirect tags table is - malformed, then give up. */ - if (!i) - { - /* The Info file containing the indirect tags table is - malformed. Give up. */ - for (i = 0; subfiles[i]; i++) - { - free (subfiles[i]->filename); - free (subfiles[i]); - free (file_buffer->subfiles[i]); - } - file_buffer->subfiles = (char **)NULL; - free_file_buffer_tags (file_buffer); - return; - } - - /* SUBFILES[i] is the index of the first subfile whose logical - first byte is greater than the logical offset of this node's - starting position. This means that the subfile directly - preceding this one is the one containing the node. */ - - entry->filename = file_buffer->subfiles[i - 1]; - entry->nodestart -= subfiles[i -1]->first_byte; - entry->nodestart += header_length; - entry->nodelen = -1; - } + position. */ + for (tags_index = 0; (entry = file_buffer->tags[tags_index]); + tags_index++) + { + for (i = 0; + subfiles[i] && entry->nodestart >= subfiles[i]->first_byte; + i++); + + /* If the Info file containing the indirect tags table is + malformed, then give up. */ + if (!i) + { + /* The Info file containing the indirect tags table is + malformed. Give up. */ + for (i = 0; subfiles[i]; i++) + { + free (subfiles[i]->filename); + free (subfiles[i]); + free (file_buffer->subfiles[i]); + } + file_buffer->subfiles = (char **)NULL; + free_file_buffer_tags (file_buffer); + return; + } + + /* SUBFILES[i] is the index of the first subfile whose logical + first byte is greater than the logical offset of this node's + starting position. This means that the subfile directly + preceding this one is the one containing the node. */ + + entry->filename = file_buffer->subfiles[i - 1]; + entry->nodestart -= subfiles[i -1]->first_byte; + entry->nodestart += header_length; + entry->nodelen = -1; + } /* We have successfully built the tags table. Remember that it - was indirect. */ + was indirect. */ file_buffer->flags |= N_TagsIndirect; } @@ -878,105 +856,105 @@ info_node_of_file_buffer_tags (file_buffer, nodename) register int i; TAG *tag; - for (i = 0; tag = file_buffer->tags[i]; i++) + for (i = 0; (tag = file_buffer->tags[i]); i++) if (strcmp (nodename, tag->nodename) == 0) { - FILE_BUFFER *subfile; - - subfile = info_find_file_internal (tag->filename, INFO_NO_TAGS); - - if (!subfile) - return ((NODE *)NULL); - - if (!subfile->contents) - { - info_reload_file_buffer_contents (subfile); - - if (!subfile->contents) - return ((NODE *)NULL); - } - - /* If we were able to find this file and load it, then return - the node within it. */ - { - NODE *node; - - node = (NODE *)xmalloc (sizeof (NODE)); - node->filename = (subfile->fullpath); - node->nodename = tag->nodename; - node->contents = subfile->contents + tag->nodestart; - node->flags = 0; - node->parent = (char *)NULL; - - if (file_buffer->flags & N_HasTagsTable) - { - node->flags |= N_HasTagsTable; - - if (file_buffer->flags & N_TagsIndirect) - { - node->flags |= N_TagsIndirect; - node->parent = file_buffer->fullpath; - } - } - - if (subfile->flags & N_IsCompressed) - node->flags |= N_IsCompressed; - - /* If TAG->nodelen hasn't been calculated yet, then we aren't - in a position to trust the entry pointer. Adjust things so - that ENTRY->nodestart gets the exact address of the start of - the node separator which starts this node, and NODE->contents - gets the address of the line defining this node. If we cannot - do that, the node isn't really here. */ - if (tag->nodelen == -1) - { - int min, max; - char *node_sep; - SEARCH_BINDING node_body; - char *buff_end; - - min = max = DEFAULT_INFO_FUDGE; - - if (tag->nodestart < DEFAULT_INFO_FUDGE) - min = tag->nodestart; - - if (DEFAULT_INFO_FUDGE > - (subfile->filesize - tag->nodestart)) - max = subfile->filesize - tag->nodestart; - - /* NODE_SEP gets the address of the separator which defines - this node, or (char *)NULL if the node wasn't found. - NODE->contents is side-effected to point to right after - the separator. */ - node_sep = adjust_nodestart (node, min, max); - if (node_sep == (char *)NULL) - { - free (node); - return ((NODE *)NULL); - } - /* Readjust tag->nodestart. */ - tag->nodestart = node_sep - subfile->contents; - - /* Calculate the length of the current node. */ - buff_end = subfile->contents + subfile->filesize; - - node_body.buffer = node->contents; - node_body.start = 0; - node_body.end = buff_end - node_body.buffer; - node_body.flags = 0; - tag->nodelen = get_node_length (&node_body); - } - else - { - /* Since we know the length of this node, we have already - adjusted tag->nodestart to point to the exact start of - it. Simply skip the node separator. */ - node->contents += skip_node_separator (node->contents); - } - - node->nodelen = tag->nodelen; - return (node); - } + FILE_BUFFER *subfile; + + subfile = info_find_file_internal (tag->filename, INFO_NO_TAGS); + + if (!subfile) + return ((NODE *)NULL); + + if (!subfile->contents) + { + info_reload_file_buffer_contents (subfile); + + if (!subfile->contents) + return ((NODE *)NULL); + } + + /* If we were able to find this file and load it, then return + the node within it. */ + { + NODE *node; + + node = (NODE *)xmalloc (sizeof (NODE)); + node->filename = (subfile->fullpath); + node->nodename = tag->nodename; + node->contents = subfile->contents + tag->nodestart; + node->flags = 0; + node->parent = (char *)NULL; + + if (file_buffer->flags & N_HasTagsTable) + { + node->flags |= N_HasTagsTable; + + if (file_buffer->flags & N_TagsIndirect) + { + node->flags |= N_TagsIndirect; + node->parent = file_buffer->fullpath; + } + } + + if (subfile->flags & N_IsCompressed) + node->flags |= N_IsCompressed; + + /* If TAG->nodelen hasn't been calculated yet, then we aren't + in a position to trust the entry pointer. Adjust things so + that ENTRY->nodestart gets the exact address of the start of + the node separator which starts this node, and NODE->contents + gets the address of the line defining this node. If we cannot + do that, the node isn't really here. */ + if (tag->nodelen == -1) + { + int min, max; + char *node_sep; + SEARCH_BINDING node_body; + char *buff_end; + + min = max = DEFAULT_INFO_FUDGE; + + if (tag->nodestart < DEFAULT_INFO_FUDGE) + min = tag->nodestart; + + if (DEFAULT_INFO_FUDGE > + (subfile->filesize - tag->nodestart)) + max = subfile->filesize - tag->nodestart; + + /* NODE_SEP gets the address of the separator which defines + this node, or (char *)NULL if the node wasn't found. + NODE->contents is side-effected to point to right after + the separator. */ + node_sep = adjust_nodestart (node, min, max); + if (node_sep == (char *)NULL) + { + free (node); + return ((NODE *)NULL); + } + /* Readjust tag->nodestart. */ + tag->nodestart = node_sep - subfile->contents; + + /* Calculate the length of the current node. */ + buff_end = subfile->contents + subfile->filesize; + + node_body.buffer = node->contents; + node_body.start = 0; + node_body.end = buff_end - node_body.buffer; + node_body.flags = 0; + tag->nodelen = get_node_length (&node_body); + } + else + { + /* Since we know the length of this node, we have already + adjusted tag->nodestart to point to the exact start of + it. Simply skip the node separator. */ + node->contents += skip_node_separator (node->contents); + } + + node->nodelen = tag->nodelen; + return (node); + } } /* There was a tag table for this file, and the node wasn't found. @@ -985,9 +963,9 @@ info_node_of_file_buffer_tags (file_buffer, nodename) } /* **************************************************************** */ -/* */ -/* Managing file_buffers, nodes, and tags. */ -/* */ +/* */ +/* Managing file_buffers, nodes, and tags. */ +/* */ /* **************************************************************** */ /* Create a new, empty file buffer. */ @@ -1018,7 +996,7 @@ remember_info_file (file_buffer) ; add_pointer_to_array (file_buffer, i, info_loaded_files, - info_loaded_files_slots, 10, FILE_BUFFER *); + info_loaded_files_slots, 10, FILE_BUFFER *); } /* Forget the contents, tags table, nodes list, and names of FILENAME. */ @@ -1032,25 +1010,25 @@ forget_info_file (filename) if (!info_loaded_files) return; - for (i = 0; file_buffer = info_loaded_files[i]; i++) + for (i = 0; (file_buffer = info_loaded_files[i]); i++) if ((strcmp (filename, file_buffer->filename) == 0) || - (strcmp (filename, file_buffer->fullpath) == 0)) + (strcmp (filename, file_buffer->fullpath) == 0)) { - free (file_buffer->filename); - free (file_buffer->fullpath); + free (file_buffer->filename); + free (file_buffer->fullpath); - if (file_buffer->contents) - free (file_buffer->contents); - - /* Note that free_file_buffer_tags () also kills the subfiles - list, since the subfiles list is only of use in conjunction - with tags. */ - free_file_buffer_tags (file_buffer); + if (file_buffer->contents) + free (file_buffer->contents); + + /* Note that free_file_buffer_tags () also kills the subfiles + list, since the subfiles list is only of use in conjunction + with tags. */ + free_file_buffer_tags (file_buffer); - while (info_loaded_files[i] = info_loaded_files[++i]) - ; + while ((info_loaded_files[i] = info_loaded_files[++i])) + ; - break; + break; } } @@ -1065,8 +1043,8 @@ free_file_buffer_tags (file_buffer) { register TAG *tag; - for (i = 0; tag = file_buffer->tags[i]; i++) - free_info_tag (tag); + for (i = 0; (tag = file_buffer->tags[i]); i++) + free_info_tag (tag); free (file_buffer->tags); file_buffer->tags = (TAG **)NULL; @@ -1076,7 +1054,7 @@ free_file_buffer_tags (file_buffer) if (file_buffer->subfiles) { for (i = 0; file_buffer->subfiles[i]; i++) - free (file_buffer->subfiles[i]); + free (file_buffer->subfiles[i]); free (file_buffer->subfiles); file_buffer->subfiles = (char **)NULL; @@ -1160,29 +1138,29 @@ adjust_nodestart (node, min, max) sep_len = skip_node_separator (node->contents); /* If we managed to skip a node separator, then check for this node - being the right one. */ + being the right one. */ if (sep_len != 0) - { - char *nodedef, *nodestart; - int offset; - - nodestart = node_body.buffer + position + sep_len; - nodedef = nodestart; - offset = string_in_line (INFO_NODE_LABEL, nodedef); - - if (offset != -1) - { - nodedef += offset; - nodedef += skip_whitespace (nodedef); - offset = skip_node_characters (nodedef, DONT_SKIP_NEWLINES); - if ((offset == strlen (node->nodename)) && - (strncmp (node->nodename, nodedef, offset) == 0)) - { - node->contents = nodestart; - return (node_body.buffer + position); - } - } - } + { + char *nodedef, *nodestart; + int offset; + + nodestart = node_body.buffer + position + sep_len; + nodedef = nodestart; + offset = string_in_line (INFO_NODE_LABEL, nodedef); + + if (offset != -1) + { + nodedef += offset; + nodedef += skip_whitespace (nodedef); + offset = skip_node_characters (nodedef, DONT_SKIP_NEWLINES); + if ((offset == strlen (node->nodename)) && + (strncmp (node->nodename, nodedef, offset) == 0)) + { + node->contents = nodestart; + return (node_body.buffer + position); + } + } + } } /* Oh well, I guess we have to try to find it in a larger area. */ diff --git a/gnu/usr.bin/texinfo/info/search.c b/gnu/usr.bin/texinfo/info/search.c index c5fd47794b0..0e8e619256a 100644 --- a/gnu/usr.bin/texinfo/info/search.c +++ b/gnu/usr.bin/texinfo/info/search.c @@ -3,7 +3,7 @@ /* This file is part of GNU Info, a program for reading online documentation stored in Info format. - Copyright (C) 1993 Free Software Foundation, Inc. + Copyright (C) 1993, 97 Free Software Foundation, Inc. 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 @@ -21,17 +21,11 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#include <ctype.h> -#include <sys/types.h> -#include <sys/stat.h> -#include "general.h" +#include "info.h" + #include "search.h" #include "nodes.h" -#if !defined (NULL) -# define NULL 0x0 -#endif /* !NULL */ - /* The search functions take two arguments: 1) a string to search for, and @@ -73,9 +67,9 @@ copy_binding (binding) /* **************************************************************** */ -/* */ -/* The Actual Searching Functions */ -/* */ +/* */ +/* The Actual Searching Functions */ +/* */ /* **************************************************************** */ /* Search forwards or backwards for the text delimited by BINDING. @@ -115,15 +109,15 @@ search_forward (string, binding) if (binding->flags & S_FoldCase) { - alternate = strdup (string); + alternate = xstrdup (string); for (i = 0; i < len; i++) - { - if (islower (alternate[i])) - alternate[i] = toupper (alternate[i]); - else if (isupper (alternate[i])) - alternate[i] = tolower (alternate[i]); - } + { + if (islower (alternate[i])) + alternate[i] = toupper (alternate[i]); + else if (isupper (alternate[i])) + alternate[i] = tolower (alternate[i]); + } } buff = binding->buffer + binding->start; @@ -132,21 +126,21 @@ search_forward (string, binding) while (buff < (end - len)) { for (i = 0; i < len; i++) - { - c = buff[i]; + { + c = buff[i]; - if ((c != string[i]) && (!alternate || c != alternate[i])) - break; - } + if ((c != string[i]) && (!alternate || c != alternate[i])) + break; + } if (!string[i]) - { - if (alternate) - free (alternate); - if (binding->flags & S_SkipDest) - buff += len; - return ((long) (buff - binding->buffer)); - } + { + if (alternate) + free (alternate); + if (binding->flags & S_SkipDest) + buff += len; + return ((long) (buff - binding->buffer)); + } buff++; } @@ -184,15 +178,15 @@ search_backward (input_string, binding) if (binding->flags & S_FoldCase) { - alternate = strdup (string); + alternate = xstrdup (string); for (i = 0; i < len; i++) - { - if (islower (alternate[i])) - alternate[i] = toupper (alternate[i]); - else if (isupper (alternate[i])) - alternate[i] = tolower (alternate[i]); - } + { + if (islower (alternate[i])) + alternate[i] = toupper (alternate[i]); + else if (isupper (alternate[i])) + alternate[i] = tolower (alternate[i]); + } } buff = binding->buffer + binding->start - 1; @@ -201,23 +195,23 @@ search_backward (input_string, binding) while (buff > (end + len)) { for (i = 0; i < len; i++) - { - c = *(buff - i); + { + c = *(buff - i); - if (c != string[i] && (alternate && c != alternate[i])) - break; - } + if (c != string[i] && (alternate && c != alternate[i])) + break; + } if (!string[i]) - { - free (string); - if (alternate) - free (alternate); + { + free (string); + if (alternate) + free (alternate); - if (binding->flags & S_SkipDest) - buff -= len; - return ((long) (1 + (buff - binding->buffer))); - } + if (binding->flags & S_SkipDest) + buff -= len; + return ((long) (1 + (buff - binding->buffer))); + } buff--; } @@ -268,9 +262,9 @@ looking_at (string, binding) } /* **************************************************************** */ -/* */ -/* Small String Searches */ -/* */ +/* */ +/* Small String Searches */ +/* */ /* **************************************************************** */ /* Function names that start with "skip" are passed a string, and return @@ -346,37 +340,43 @@ skip_node_characters (string, newlines_okay) for (; string && (c = string[i]); i++) { if (paren) - { - if (c == '(') - paren++; - else if (c == ')') - paren--; - - continue; - } + { + if (c == '(') + paren++; + else if (c == ')') + paren--; + + continue; + } /* If the character following the close paren is a space or period, - then this node name has no more characters associated with it. */ + then this node name has no more characters associated with it. */ if (c == '\t' || - c == ',' || - c == INFO_TAGSEP || - ((!newlines_okay) && (c == '\n')) || - ((paren_seen && string[i - 1] == ')') && - (c == ' ' || c == '.')) || - (c == '.' && - ((!string[i + 1]) || - (whitespace_or_newline (string[i + 1])) || - (string[i + 1] == ')')))) - break; + c == ',' || + c == INFO_TAGSEP || + ((!newlines_okay) && (c == '\n')) || + ((paren_seen && string[i - 1] == ')') && + (c == ' ' || c == '.')) || + (c == '.' && + ( +#if 0 +/* This test causes a node name ending in a period, like `This.', not to + be found. The trailing . is stripped. This occurs in the jargon + file (`I see no X here.' is a node name). */ + (!string[i + 1]) || +#endif + (whitespace_or_newline (string[i + 1])) || + (string[i + 1] == ')')))) + break; } return (i); } /* **************************************************************** */ -/* */ -/* Searching FILE_BUFFER's */ -/* */ +/* */ +/* Searching FILE_BUFFER's */ +/* */ /* **************************************************************** */ /* Return the absolute position of the first occurence of a node separator in @@ -397,11 +397,11 @@ find_node_separator (binding) table (if present) and the indirect tags table (if present). */ for (i = binding->start; i < binding->end - 1; i++) if (((body[i] == INFO_FF && body[i + 1] == INFO_COOKIE) && - (body[i + 2] == '\n' || - (body[i + 2] == INFO_FF && body[i + 3] == '\n'))) || - ((body[i] == INFO_COOKIE) && - (body[i + 1] == '\n' || - (body[i + 1] == INFO_FF && body[i + 2] == '\n')))) + (body[i + 2] == '\n' || + (body[i + 2] == INFO_FF && body[i + 3] == '\n'))) || + ((body[i] == INFO_COOKIE) && + (body[i + 1] == '\n' || + (body[i + 1] == INFO_FF && body[i + 2] == '\n')))) return (i); return (-1); } @@ -467,7 +467,7 @@ find_tags_table (binding) search.start += skip_node_separator (search.buffer + search.start); if (looking_at (TAGS_TABLE_BEG_LABEL, &search)) - return (position); + return (position); } return (-1); } @@ -482,8 +482,8 @@ find_node_in_binding (nodename, binding) char *nodename; SEARCH_BINDING *binding; { - register long position; - register int offset, namelen; + long position; + int offset, namelen; SEARCH_BINDING search; namelen = strlen (nodename); @@ -501,19 +501,19 @@ find_node_in_binding (nodename, binding) offset = string_in_line (INFO_NODE_LABEL, search.buffer + search.start); if (offset == -1) - continue; + continue; search.start += offset; search.start += skip_whitespace (search.buffer + search.start); offset = skip_node_characters - (search.buffer + search.start, DONT_SKIP_NEWLINES); + (search.buffer + search.start, DONT_SKIP_NEWLINES); /* Notice that this is an exact match. You cannot grovel through - the buffer with this function looking for random nodes. */ + the buffer with this function looking for random nodes. */ if ((offset == namelen) && - (search.buffer[search.start] == nodename[0]) && - (strncmp (search.buffer + search.start, nodename, offset) == 0)) - return (position); + (search.buffer[search.start] == nodename[0]) && + (strncmp (search.buffer + search.start, nodename, offset) == 0)) + return (position); } return (-1); } diff --git a/gnu/usr.bin/texinfo/info/session.h b/gnu/usr.bin/texinfo/info/session.h index 98b8ccf695f..f1e5b23be8a 100644 --- a/gnu/usr.bin/texinfo/info/session.h +++ b/gnu/usr.bin/texinfo/info/session.h @@ -21,10 +21,10 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#if !defined (_SESSION_H_) -#define _SESSION_H_ +#if !defined (SESSION_H) +#define SESSION_H -#include "general.h" +#include "info.h" #include "dribble.h" /* All commands that can be invoked from within info_session () receive @@ -55,11 +55,11 @@ extern int info_scroll_behaviour; extern char *info_scroll_choices[]; /* Values for info_scroll_behaviour. */ -#define IS_Continuous 0 /* Try to get first menu item, or failing that, the - "Next:" pointer, or failing that, the "Up:" and - "Next:" of the up. */ +#define IS_Continuous 0 /* Try to get first menu item, or failing that, the + "Next:" pointer, or failing that, the "Up:" and + "Next:" of the up. */ #define IS_NextOnly 1 /* Try to get "Next:" menu item. */ -#define IS_PageOnly 2 /* Simply give up at the bottom of a node. */ +#define IS_PageOnly 2 /* Simply give up at the bottom of a node. */ /* Utility functions found in session.c */ extern void info_dispatch_on_key (); @@ -143,4 +143,4 @@ extern void info_print_node (); /* Miscellaneous commands. */ extern void info_abort_key (), info_quit (), info_do_lowercase_version (); -#endif /* _SESSION_H_ */ +#endif /* SESSION_H */ diff --git a/gnu/usr.bin/texinfo/info/signals.c b/gnu/usr.bin/texinfo/info/signals.c index a60777fe597..b93a585f567 100644 --- a/gnu/usr.bin/texinfo/info/signals.c +++ b/gnu/usr.bin/texinfo/info/signals.c @@ -25,9 +25,9 @@ #include "signals.h" /* **************************************************************** */ -/* */ -/* Pretending That We Have POSIX Signals */ -/* */ +/* */ +/* Pretending That We Have POSIX Signals */ +/* */ /* **************************************************************** */ #if !defined (HAVE_SIGPROCMASK) && defined (HAVE_SIGSETMASK) @@ -57,33 +57,32 @@ sigprocmask (operation, newset, oldset) #endif /* !HAVE_SIGPROCMASK && HAVE_SIGSETMASK */ /* **************************************************************** */ -/* */ -/* Signal Handling for Info */ -/* */ +/* */ +/* Signal Handling for Info */ +/* */ /* **************************************************************** */ -typedef void SigHandlerType; -typedef SigHandlerType SigHandler (); +typedef RETSIGTYPE signal_handler (); -static SigHandlerType info_signal_handler (); -static SigHandler *old_TSTP, *old_TTOU, *old_TTIN; -static SigHandler *old_WINCH, *old_INT; +static RETSIGTYPE info_signal_handler (); +static signal_handler *old_TSTP, *old_TTOU, *old_TTIN; +static signal_handler *old_WINCH, *old_INT; void initialize_info_signal_handler () { #if defined (SIGTSTP) - old_TSTP = (SigHandler *) signal (SIGTSTP, info_signal_handler); - old_TTOU = (SigHandler *) signal (SIGTTOU, info_signal_handler); - old_TTIN = (SigHandler *) signal (SIGTTIN, info_signal_handler); + old_TSTP = (signal_handler *) signal (SIGTSTP, info_signal_handler); + old_TTOU = (signal_handler *) signal (SIGTTOU, info_signal_handler); + old_TTIN = (signal_handler *) signal (SIGTTIN, info_signal_handler); #endif /* SIGTSTP */ #if defined (SIGWINCH) - old_WINCH = (SigHandler *) signal (SIGWINCH, info_signal_handler); + old_WINCH = (signal_handler *) signal (SIGWINCH, info_signal_handler); #endif #if defined (SIGINT) - old_INT = (SigHandler *) signal (SIGINT, info_signal_handler); + old_INT = (signal_handler *) signal (SIGINT, info_signal_handler); #endif } @@ -98,11 +97,11 @@ redisplay_after_signal () fflush (stdout); } -static SigHandlerType +static RETSIGTYPE info_signal_handler (sig) int sig; { - SigHandler **old_signal_handler; + signal_handler **old_signal_handler; switch (sig) { @@ -116,56 +115,56 @@ info_signal_handler (sig) #endif { #if defined (SIGTSTP) - if (sig == SIGTSTP) - old_signal_handler = &old_TSTP; - if (sig == SIGTTOU) - old_signal_handler = &old_TTOU; - if (sig == SIGTTIN) - old_signal_handler = &old_TTIN; + if (sig == SIGTSTP) + old_signal_handler = &old_TSTP; + if (sig == SIGTTOU) + old_signal_handler = &old_TTOU; + if (sig == SIGTTIN) + old_signal_handler = &old_TTIN; #endif /* SIGTSTP */ - if (sig == SIGINT) - old_signal_handler = &old_INT; - - /* For stop signals, restore the terminal IO, leave the cursor - at the bottom of the window, and stop us. */ - terminal_goto_xy (0, screenheight - 1); - terminal_clear_to_eol (); - fflush (stdout); - terminal_unprep_terminal (); - signal (sig, *old_signal_handler); - UNBLOCK_SIGNAL (sig); - kill (getpid (), sig); - - /* The program is returning now. Restore our signal handler, - turn on terminal handling, redraw the screen, and place the - cursor where it belongs. */ - terminal_prep_terminal (); - *old_signal_handler = (SigHandler *) signal (sig, info_signal_handler); - redisplay_after_signal (); - fflush (stdout); + if (sig == SIGINT) + old_signal_handler = &old_INT; + + /* For stop signals, restore the terminal IO, leave the cursor + at the bottom of the window, and stop us. */ + terminal_goto_xy (0, screenheight - 1); + terminal_clear_to_eol (); + fflush (stdout); + terminal_unprep_terminal (); + signal (sig, *old_signal_handler); + UNBLOCK_SIGNAL (sig); + kill (getpid (), sig); + + /* The program is returning now. Restore our signal handler, + turn on terminal handling, redraw the screen, and place the + cursor where it belongs. */ + terminal_prep_terminal (); + *old_signal_handler = (signal_handler *) signal (sig, info_signal_handler); + redisplay_after_signal (); + fflush (stdout); } break; #if defined (SIGWINCH) case SIGWINCH: { - /* Turn off terminal IO, tell our parent that the window has changed, - then reinitialize the terminal and rebuild our windows. */ - old_signal_handler = &old_WINCH; - terminal_goto_xy (0, 0); - fflush (stdout); - terminal_unprep_terminal (); - signal (sig, *old_signal_handler); - UNBLOCK_SIGNAL (sig); - kill (getpid (), sig); - - /* After our old signal handler returns... */ - terminal_get_screen_size (); - terminal_prep_terminal (); - display_initialize_display (screenwidth, screenheight); - window_new_screen_size (screenwidth, screenheight, (VFunction *)NULL); - *old_signal_handler = (SigHandler *) signal (sig, info_signal_handler); - redisplay_after_signal (); + /* Turn off terminal IO, tell our parent that the window has changed, + then reinitialize the terminal and rebuild our windows. */ + old_signal_handler = &old_WINCH; + terminal_goto_xy (0, 0); + fflush (stdout); + terminal_unprep_terminal (); + signal (sig, *old_signal_handler); + UNBLOCK_SIGNAL (sig); + kill (getpid (), sig); + + /* After our old signal handler returns... */ + terminal_get_screen_size (); + terminal_prep_terminal (); + display_initialize_display (screenwidth, screenheight); + window_new_screen_size (screenwidth, screenheight, (VFunction *)NULL); + *old_signal_handler = (signal_handler *) signal (sig, info_signal_handler); + redisplay_after_signal (); } break; #endif /* SIGWINCH */ diff --git a/gnu/usr.bin/texinfo/info/terminal.h b/gnu/usr.bin/texinfo/info/terminal.h index 7cb115835c6..2e27268ea7f 100644 --- a/gnu/usr.bin/texinfo/info/terminal.h +++ b/gnu/usr.bin/texinfo/info/terminal.h @@ -3,7 +3,7 @@ /* This file is part of GNU Info, a program for reading online documentation stored in Info format. - Copyright (C) 1993, 96 Free Software Foundation, Inc. + Copyright (C) 1993, 96, 97 Free Software Foundation, Inc. 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 @@ -21,15 +21,10 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -#if !defined (_TERMINAL_H_) -#define _TERMINAL_H_ +#if !defined (TERMINAL_H) +#define TERMINAL_H -/* We use the following data type to talk about pointers to functions. */ -#if !defined (__FUNCTION_DEF) -# define __FUNCTION_DEF -typedef int Function (); -typedef void VFunction (); -#endif /* _FUNCTION_DEF */ +#include "info.h" /* For almost every function externally visible from terminal.c, there is a corresponding "hook" function which can be bound in order to replace @@ -125,5 +120,6 @@ extern VFunction *terminal_ring_bell_hook; /* The key sequences output by the arrow keys, if this terminal has any. */ extern char *term_ku, *term_kd, *term_kr, *term_kl; +extern char *term_kP, *term_kN; -#endif /* !_TERMINAL_H_ */ +#endif /* !TERMINAL_H */ diff --git a/gnu/usr.bin/texinfo/info/tilde.h b/gnu/usr.bin/texinfo/info/tilde.h index d66aee95015..83f534b2bac 100644 --- a/gnu/usr.bin/texinfo/info/tilde.h +++ b/gnu/usr.bin/texinfo/info/tilde.h @@ -25,13 +25,10 @@ Written by Brian Fox (bfox@ai.mit.edu). */ -/* Function pointers can be declared as (Function *)foo. */ -#if !defined (__FUNCTION_DEF) -# define __FUNCTION_DEF -typedef int Function (); -typedef void VFunction (); -typedef char *CFunction (); -#endif /* _FUNCTION_DEF */ +#ifndef TILDE_H +#define TILDE_H + +#include "info.h" /* If non-null, this contains the address of a function to call if the standard meaning for expanding a tilde fails. The function is called @@ -56,3 +53,4 @@ extern char *tilde_expand (); tilde. If there is no expansion, call tilde_expansion_failure_hook. */ extern char *tilde_expand_word (); +#endif /* not TILDE_H */ diff --git a/gnu/usr.bin/texinfo/intl/ChangeLog b/gnu/usr.bin/texinfo/intl/ChangeLog new file mode 100644 index 00000000000..cfb34fabba7 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/ChangeLog @@ -0,0 +1,967 @@ +Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in: Implement handling of libtool. + + * gettextP.h: Change data structures for use of generic lowlevel + i18n file handling. + +Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Put parentheses around arguments of memcpy macro + definition. + * localealias.c: Likewise. + * l10nflist.c: Likewise. + * finddomain.c: Likewise. + * bindtextdom.c: Likewise. + Reported by Thomas Esken. + +Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Move definition of `memcpy` macro to right + position. + +Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper@cygnus.com> + + * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using + bcopy if not already defined. Reported by Thomas Esken. + * bindtextdom.c: Likewise. + * l10nflist.c: Likewise. + * localealias.c: Likewise. + * textdomain.c: Likewise. + +Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (libdir): Change to use exec_prefix instead of + prefix. Reported by Knut-HåvardAksnes <etokna@eto.ericsson.se>. + +Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (_nl_normalize_codeset): We convert to lower case, + so don't prepend uppercase `ISO' for only numeric arg. + +Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after + definition of _GNU_SOURCE. Patch by Roland McGrath. + + * Makefile.in (uninstall): Fix another bug with `for' loop and + empty arguments. Patch by Jim Meyering. Correct name os + uninstalled files: no intl- prefix anymore. + + * Makefile.in (install-data): Again work around shells which + cannot handle mpty for list. Reported by Jim Meyering. + +Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Split goal. Now depend on install-exec + and install-data. + (install-exec, install-data): New goals. Created from former + install goal. + Reported by Karl Berry. + +Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (MKINSTALLDIRS): New variable. Path to + mkinstalldirs script. + (install): use MKINSTALLDIRS variable or if the script is not present + try to find it in the $top_scrdir). + +Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Linux libc *partly* includes the argz_* functions. + Grr. Work around by renaming the static version and use macros + for renaming. + +Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Correct presence test macros of __argz_* functions. + + * l10nflist.c: Include <argz.h> based on test of it instead when + __argz_* functions are available. + Reported by Andreas Schwab. + +Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper@cygnus.com> + + * explodename.c, l10nflist.c: Define NULL for dumb systems. + +Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in, libgettext.h (dcgettext): Rename local variable + result to __result to prevent name clash. + + * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to + get prototype for stpcpy and strcasecmp. + + * intlh.inst.in, libgettext.h: Move declaration of + `_nl_msg_cat_cntr' outside __extension__ block to prevent warning + from gcc's -Wnested-extern option. + +Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Remove comment. + +Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Work around for another Buglix stupidity. + Always use an `else' close for `if's. Reported by Nelson Beebe. + + * Makefile.in (intlh.inst): Correct typo in phony rule. + Reported by Nelson Beebe. + +Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (read_alias_file): Rename variable alloca_list to + block_list as the macro calls assume. + Patch by Eric Backus. + + * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using + malloc. + (read_alias_file): Rename varriabe alloca_list to block_list as the + macro calls assume. + Patch by Eric Backus. + + * l10nflist.c: Correct conditional for <argz.h> inclusion. + Reported by Roland McGrath. + + * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not + all-@USE_NLS@. + + * Makefile.in (install): intlh.inst comes from local dir, not + $(srcdir). + + * Makefile.in (intlh.inst): Special handling of this goal. If + used in gettext, this is really a rul to construct this file. If + used in any other package it is defined as a .PHONY rule with + empty body. + + * finddomain.c: Extract locale file information handling into + l10nfile.c. Rename local stpcpy__ function to stpcpy. + + * dcgettext.c (stpcpy): Add local definition. + + * l10nflist.c: Solve some portability problems. Patches partly by + Thomas Esken. Add local definition of stpcpy. + +Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in: Don't depend including <locale.h> on + HAVE_LOCALE_H. Instead configure must rewrite this fiile + depending on the result of the configure run. + + * Makefile.in (install): libintl.inst is now called intlh.inst. + Add rules for updating intlh.inst from intlh.inst.in. + + * libintl.inst: Renamed to intlh.inst.in. + + * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 + because gcc has __buitlin_alloca. + Reported by Roland McGrath. + +Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (installcheck): New goal to fulfill needs of + automake's distcheck. + + * Makefile.in (install): Reorder commands so that VERSION is + found. + + * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in + @datadir@/gettext. + (COMSRCS): Add l10nfile.c. + (OBJECTS): Add l10nfile.o. + (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). + (DISTFILE.gettext): Remove $(DISTFILES.common). + (all-gettext): Remove goal. + (install): If $(PACKAGE) = gettext install, otherwose do nothing. No + package but gettext itself should install libintl.h + headers. + (dist): Extend goal to work for gettext, too. + (dist-gettext): Remove goal. + + * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. + +Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper@cygnus.com> + + * loadmsgcat.c (_nl_load_domain): Parameter is now comes from + find_l10nfile. + +Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (__argz_next): Add definition. + + * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca + code. Use new l10nfile handling. + + * localealias.c [!HAVE_ALLOCA]: Add code for handling missing + alloca code. + + * l10nflist.c: Initial revision. + +Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-gettext): New goal. Same as all-yes. + +Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke@ke.central.de> + + * Makefile.in (gettextsrcdir): Define using @datadir@. + +Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c: Include <ctype.h>. Reported by Roland McGrath. + +Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing + with external declaration. + +Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-no): Rename from all_no. + +Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper@myware> + + * gettextP.h [loaded_domain]: Array `successor' must now contain up + to 63 elements (because of codeset name normalization). + + * finddomain.c: Implement codeset name normalization. + +Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all): Define to `all-@USE_NLS@'. + (all-yes, all_no): New goals. `all-no' is noop, `all-yes' + is former all. + +Mon Jan 15 21:46:01 1996 Howard Gayle <howard@hal.com> + + * localealias.c (alias_compare): Increment string pointers in loop + of strcasecmp replacement. + +Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Who commented this goal out ? :-) + +Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls + should not effect it because a missing catalog is no error. + Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>. + +Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (Makefile): Explicitly use $(SHELL) for running + shell scripts. + +Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile.in (install-src): Only install library and header when + we use the own implementation. Don't do it when using the + system's gettext or catgets functions. + + * dcgettext.c (find_msg): Must not swap domain->hash_size here. + +Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper@myware> + + * localealias.c, libintl.inst, libgettext.h, hash-string.h, + gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: + Use PARAMS instead of __P. Suggested by Roland McGrath. + +Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud@cyclone.stanford.edu> + + * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if + !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. + +Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): + Install libintl.inst instead of libintl.h.install. + +Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus@sysc.pdx.edu> + + * cat-compat.c (textdomain): + Reverse order in which files are tried you load. First + try local file, when this failed absolute path. + +Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * cat-compat.c (bindtextdomain): Add missing { }. + +Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware> + + * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. + + * Makefile.in: + Add dummy `all' and `dvi' goals. Reported by Tom Tromey. + +Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard@iro.umontreal.ca> + + * hash-string.h: Capitalize arguments of macros. + +Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Prevent files names longer than 13 + characters. libintl.h.glibc->libintl.glibc, + libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. + +Sat Nov 25 11:31:12 1995 Eric Backus <ericb@lsid.hp.com> + + * dcgettext.c: Fix bug in preprocessor conditionals. + +Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * libgettext.h: Solaris cc does not understand + #if !SYMBOL1 && !SYMBOL2. Sad but true. + +Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): + Fix for machine with >32 bit `unsigned long's. + + * dcgettext.c (DCGETTEXT): + Fix horrible bug in loop for alternative translation. + +Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: + Some further simplifications in message number generation. + +Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware> + + * libintl.h.glibc: Use __const instead of const in prototypes. + + * Makefile.in (install-src): + Install libintl.h.install instead of libintl.h. This + is a stripped-down version. Suggested by Peter Miller. + + * libintl.h.install, libintl.h.glibc: Initial revision. + + * localealias.c (_nl_expand_alias, read_alias_file): + Protect prototypes in type casts by __P. + +Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h: Correct prototype for hash_string. + +Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): Add prototype. + + * gettextP.h: Fix copyright. + (SWAP): Add prototype. + +Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): Forgot sizeof. + Avoid calling *printf function. This introduces a big overhead. + Patch by Roland McGrath. + +Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. + + * finddomain.c (stpcpy): + Define substitution function local. The macro was to flaky. + + * cat-compat.c: Fix typo. + + * xopen-msg.sed, linux-msg.sed: + While bringing message number to right place only accept digits. + + * linux-msg.sed, xopen-msg.sed: Now that the counter does not have + leading 0s we don't need to remove them. Reported by Marcus + Daniels. + + * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in + dependency. Reported by Marcus Daniels. + + * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. + Generally cleanup using #if instead of #ifndef. + + * Makefile.in: Correct typos in comment. By Franc,ois Pinard. + +Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Don't install libintl.h and libintl.a + if we use an available gettext implementation. + +Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported + by Franc,ois Pinard. + + * libgettext.h: Use #if instead of #ifdef/#ifndef. + + * finddomain.c: + Comments describing what has to be done should start with FIXME. + +Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. + DISTFILES.common names the files common to both dist goals. + DISTFILES.gettext are the files only distributed in GNU gettext. + +Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Correct searching in derived locales. + This was necessary since a change in _nl_find_msg several weeks + ago. I really don't know this is still not fixed. + +Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This + might mark a special condition. + + * finddomain.c (make_entry_rec): Don't make illegal entry as decided. + + * Makefile.in (dist): Suppress error message when ln failed. + Get files from $(srcdir) explicitly. + + * libgettext.h (gettext_const): Rename to gettext_noop. + +Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (make_entry_rec): + Protect against wrong locale names by testing mask. + + * libgettext.h (gettext_const): Add macro definition. + Capitalize macro arguments. + +Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Test for pointer != NULL before accessing value. + Reported by Tom Tromey. + + * gettext.c (NULL): + Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. + +Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. + +Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Disable dcgettext optimization for Solaris 2.3. + + * localealias.c (alias_compare): + Peter Miller reported that tolower in some systems is + even dumber than I thought. Protect call by `isupper'. + +Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (libdir, includedir): New variables. + (install-src): Install libintl.a and libintl.h in correct dirs. + +Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. + + * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. + + * localealias.c: + Fix typo and superflous test. Reported by Christian von Roques. + +Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Correct some remainder from the pre-CEN syntax. Now + we don't have a constant number of successors anymore. + +Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Add libintl.h.glibc. + + * Makefile.in (dist-libc): Add goal for packing sources for glibc. + (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. + + * loadmsgcat.c: Forget to continue #if line. + + * localealias.c: + [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name + space clean. + + * dcgettext.c, finddomain.c: Better comment to last change. + + * loadmsgcat.c: + [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to + __fstat, __open, __close, __read, __mmap, and __munmap resp + to keep ANSI C name space clean. + + * finddomain.c: + [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. + + * dcgettext.c: + [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to + keep ANSI C name space clean. + + * libgettext.h: + Include sys/types.h for those old SysV systems out there. + Reported by Francesco Potorti`. + + * loadmsgcat.c (use_mmap): Define if compiled for glibc. + + * bindtextdom.c: Include all those standard headers + unconditionally if _LIBC is defined. + + * finddomain.c: Fix 2 times defiend -> defined. + + * textdomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. + + * gettext.c: + Include libintl.h instead of libgettext.h when compiling for glibc. + Get NULL from stddef.h if we compile for glibc. + + * finddomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * dcgettext.c: Include all those standard headers unconditionally + if _LIBC is defined. + + * dgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. + + * dcgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. + + * bindtextdom.c: + If compiled in glibc include libintl.h instead of libgettext.h. + +Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. + Reported by Marcus Daniels. + + * cat-compat.c (bindtextdomain): + String used in putenv must not be recycled. + Reported by Marcus Daniels. + + * libgettext.h (__USE_GNU_GETTEXT): + Additional symbol to signal that we use GNU gettext + library. + + * cat-compat.c (bindtextdomain): + Fix bug with the strange stpcpy replacement. + Reported by Nelson Beebe. + +Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: Include <string.h> for stpcpy prototype. + + * localealias.c (read_alias_file): + While expand strdup code temporary variable `cp' hided + higher level variable with same name. Rename to `tp'. + + * textdomain.c (textdomain): + Avoid warning by using temporary variable in strdup code. + + * finddomain.c (_nl_find_domain): Remove unused variable `application'. + +Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (alias_compare): + Use strcasecmp() only if available. Else use + implementation in place. + + * intl-compat.c: + Wrapper functions now call *__ functions instead of __*. + + * libgettext.h: Declare prototypes for *__ functions instead for __*. + + * cat-compat.c, loadmsgcat.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + + * bindtextdom.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Rename to bindtextdomain__ if not used in GNU C Library. + + * dgettext.c: + Rename function to dgettext__ if not used in GNU C Library. + + * gettext.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Functions now called gettext__ if not used in GNU C Library. + + * dcgettext.c, localealias.c, textdomain.c, finddomain.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + +Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Correct some bugs in handling of CEN standard + locale definitions. + +Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Implement CEN syntax. + + * gettextP.h (loaded_domain): Extend number of successors to 31. + +Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (aliaspath): Remove path to X11 locale dir. + + * Makefile.in: Make install-src depend on install. This helps + gettext to install the sources and other packages can use the + install goal. + +Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (uninstall): Remove stuff installed by install-src. + +Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware> + + * VERSION.in: Initial revision. + + * Makefile.in (DISTFILES): + Add VERSION file. This is not necessary for gettext, but + for other packages using this library. + +Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_find_domain): + New prototype after changing search strategy. + + * finddomain.c (_nl_find_domain): + We now try only to find a specified catalog. Fall back to other + catalogs listed in the locale list is now done in __dcgettext. + + * dcgettext.c (__dcgettext): + Now we provide message fall back even to different languages. + I.e. if a message is not available in one language all the other + in the locale list a tried. Formerly fall back was only possible + within one language. Implemented by moving one loop from + _nl_find_domain to here. + +Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gettextsrcdir): + Directory where source of GNU gettext library are made + available. + (INSTALL, INSTALL_DATA): Programs used for installing sources. + (gettext-src): New. Rule to install GNU gettext sources for use in + gettextize shell script. + +Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): + Use mmap for loading only when munmap function is + also available. + + * Makefile.in (install): Depend on `all' goal. + +Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): + Do not overwrite '\n' when terminating alias value string. + + * localealias.c (read_alias_file): + Handle long lines. Ignore the rest not fitting in + the buffer after the initial `fgets' call. + +Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_load_domain): + Add prototype, replacing prototype for _nl_load_msg_cat. + + * finddomain.c (_nl_find_domain): + Remove unneeded variable filename and filename_len. + (expand_alias): Remove prototype because functions does not + exist anymore. + + * localealias.c (read_alias_file): + Change type of fname_len parameter to int. + (xmalloc): Add prototype. + + * loadmsgcat.c: Better prototypes for xmalloc. + +Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Allow alias name to be constructed from the four components. + + * Makefile.in (aliaspath): New variable. Set to preliminary value. + (SOURCES): Add localealias.c. + (OBJECTS): Add localealias.o. + + * gettextP.h: Add prototype for _nl_expand_alias. + + * finddomain.c: Aliasing handled in intl/localealias.c. + + * localealias.c: Aliasing for locale names. + + * bindtextdom.c: Better prototypes for xmalloc and xstrdup. + +Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): gettext.perl is now found in misc/. + + * cat-compat.c (bindtextdomain): + Correct implementation. dirname parameter was not used. + Reported by Marcus Daniels. + + * gettextP.h (loaded_domain): + New fields `successor' and `decided' for oo, lazy + message handling implementation. + + * dcgettext.c: + Adopt for oo, lazy message handliing. + Now we can inherit translations from less specific locales. + (find_msg): New function. + + * loadmsgcat.c, finddomain.c: + Complete rewrite. Implement oo, lazy message handling :-). + We now have an additional environment variable `LANGUAGE' with + a higher priority than LC_ALL for the LC_MESSAGE locale. + Here we can set a colon separated list of specifications each + of the form `language[_territory[.codeset]][@modifier]'. + +Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (unistd.h): + Include to get _PC_PATH_MAX defined on system having it. + +Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Include prototype. + + * Makefile.in (dist): Remove `copying instead' message. + +Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ID, TAGS): Do not use $^. + +Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (TAGS, ID): Use $^ as command argument. + (TAGS): Give etags -o option t write to current directory, + not $(srcdir). + (ID): Use $(srcdir) instead os $(top_srcdir)/src. + (distclean): Remove ID. + +Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gnulocaledir): + New variable, always using share/ for data directory. + (DEFS): Add GNULOCALEDIR, used in finddomain.c. + + * finddomain.c (_nl_default_dirname): + Set to GNULOCALEDIR, because it always has to point + to the directory where GNU gettext Library writes it to. + + * intl-compat.c (textdomain, bindtextdomain): + Undefine macros before function definition. + +Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h (_LIBINTL_H): + Protect definition in case where this file is included as + libgettext.h on Solaris machines. Add comment about this. + +Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware> + + * intl-compat.c (textdomain): Correct typo. + +Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (dcgettext): Function now called __dcgettext. + + * dgettext.c (dgettext): Now called __dgettext and calls + __dcgettext. + + * gettext.c (gettext): + Function now called __gettext and calls __dgettext. + + * textdomain.c (textdomain): Function now called __textdomain. + + * bindtextdom.c (bindtextdomain): Function now called + __bindtextdomain. + + * intl-compat.c: Initial revision. + + * Makefile.in (SOURCES): Add intl-compat.c. + (OBJECTS): We always compile the GNU gettext library functions. + OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, + and intl-compat.o. + (GETTOBJS): Contains now only intl-compat.o. + + * libgettext.h: + Re-include protection matches dualistic character of libgettext.h. + For all functions in GNU gettext library define __ counter part. + + * finddomain.c (strchr): Define as index if not found in C library. + (_nl_find_domain): For relative paths paste / in between. + +Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. + + * xopen-msg.sed: Fix bug with `msgstr ""' lines. + A little bit better comments. + +Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + po-mode.el, makelinks, combine-sh are now found in ../misc. + + * po-mode.el, makelinks, combine-sh, elisp-comp: + Moved to ../misc/. + + * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. + +Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (INSTALL, INSTALL_DATA): New variables. + (install-data, uninstall): Install/uninstall .elc file. + + * po-mode.el (Installation comment): + Add .pox as possible extension of .po files. + +Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware> + + * elisp-comp: Complete new version by Franc,ois: This does not + fail when not compiling in the source directory. + +Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (../po/cat-id-tbl.o): + Use $(MAKE) instead of make for recursive make. + + * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. + (install-exec): Add missing dummy goal. + (install-data, uninstall): @ in multi-line shell command at + beginning, not in front of echo. Reported by Eric Backus. + +Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): + Rename libgettext.perl to gettext.perl to fit in 14 chars + file systems. + + * gettext.perl: + Rename to gettext.perl to fit in 14 chars file systems. + +Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: If !STDC_HEADERS try to include malloc.h. + +Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Pretty printing. + + * linux-msg.sed, xopen-msg.sed: + Correct bugs with handling substitute flags in branches. + + * hash-string.h (hash_string): + Old K&R compilers don't under stand `unsigned char'. + + * gettext.h (nls_uint32): + Some old K&R compilers (eg HP) don't understand `unsigned int'. + + * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. + +Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ELCFILES): New variable. + (DISTFILES): Add elisp-comp. + Add implicit rule for .el -> .elc compilation. + (install-data): install $ELCFILES + (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. + + * elisp-comp: Initial revision + +Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + cat-id-tbl.c is now found in po/. This enables us to use an identical + intl/ directory in all packages. + + * dcgettext.c (dcgettext): hashing does not work for table size <= 2. + + * textdomain.c: fix typo (#if def -> #if defined) + +Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (stamp-cat-id): use top_srcdir to address source files + (DISTFILES,distclean): move tupdate.perl to src/ + + * po-to-tbl.sed.in: + add additional jump to clear change flag to recognize multiline strings + +Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware> + + * textdomain.c: Protect inclusion of stdlib.h and string.h. + + * loadmsgcat.c: Protect inclusion of stdlib.h. + + * libgettext.h: Protect inclusion of locale.h. + Allow use in C++ programs. + Define NULL is not happened already. + + * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of + po-to-tbl.sed. + (distclean): remove po-to-tbl.sed and tupdate.perl. + + * tupdate.perl.in: Substitute Perl path even in exec line. + Don't include entries without translation from old .po file. + +Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: use "Updated: " in msgid "". + + * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). + Define getenv if !__STDC__. + + * bindtextdom.c: Protect stdlib.h and string.h inclusion. + Define free if !__STDC__. + + * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + Define free if !__STDC__. + + * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + +Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. + Remove unneeded $(srcdir) from Makefile.in dependency. + + * makelinks: Add copyright and short description. + + * po-mode.el: Last version for 0.7. + + * tupdate.perl.in: Fix die message. + + * dcgettext.c: Protect include of string.h. + + * gettext.c: Protect include of stdlib.h and further tries to get NULL. + + * finddomain.c: Some corrections in includes. + + * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. + + * po-to-tbl.sed: Adopt for new .po file format. + + * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. + +Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: Complete rewrite for new .po file format. + +Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware> + + * First official release. This directory contains all the code + needed to internationalize own packages. It provides functions + which allow to use the X/Open catgets function with an interface + like the Uniforum gettext function. For system which does not + have neither of those a complete implementation is provided. diff --git a/gnu/usr.bin/texinfo/intl/Makefile.in b/gnu/usr.bin/texinfo/intl/Makefile.in new file mode 100644 index 00000000000..72a697edf4f --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/Makefile.in @@ -0,0 +1,214 @@ +# Makefile for directory with message catalog handling in GNU NLS Utilities. +# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +# +# 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. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = $(exec_prefix)/lib +includedir = $(prefix)/include +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = @datadir@/gettext/intl +aliaspath = $(localedir):. +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ + +l = @l@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \ +-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = $(COMHDRS) libgettext.h loadinfo.h +COMHDRS = gettext.h gettextP.h hash-string.h +SOURCES = $(COMSRCS) intl-compat.c cat-compat.c +COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ +finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ +explodename.c +OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ +finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ +explodename.$lo +CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo +GETTOBJS = intl-compat.$lo +DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \ +xopen-msg.sed $(HEADERS) $(SOURCES) +DISTFILES.normal = VERSION +DISTFILES.gettext = libintl.glibc intlh.inst.in + +.SUFFIXES: +.SUFFIXES: .c .o .lo +.c.o: + $(COMPILE) $< +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) $< + +INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib + +all: all-@USE_INCLUDED_LIBINTL@ + +all-yes: libintl.$la intlh.inst +all-no: + +libintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \ + -version-info 1:0 -rpath $(libdir) + +../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot + cd ../po && $(MAKE) cat-id-tbl.$lo + +check: all + +# This installation goal is only used in GNU gettext. Packages which +# only use the library should use install instead. + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the gettext() function in its C library or in a +# separate library or use the catgets interface. A special case is +# where configure found a previously installed GNU gettext library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(libdir) $(includedir); \ + else \ + $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \ + fi; \ + $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \ + $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext"; then \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \ + cd $(srcdir) && \ + dists="$(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $$file $(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + dists="$(DISTFILES.common)"; \ + for file in $$dists; do \ + rm -f $(gettextsrcdir)/$$file; \ + done + +info dvi: + +$(OBJECTS): ../config.h libgettext.h +bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h +dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.o *.lo core core.* + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS po2msg.sed po2tbl.sed libintl.h + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile $(DISTFILES) + if test "$(PACKAGE)" = gettext; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + for file in $(DISTFILES.common) $$additional; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +dist-libc: + tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc + +Makefile: Makefile.in ../config.status + cd .. \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# The dependency for intlh.inst is different in gettext and all other +# packages. Because we cannot you GNU make features we have to solve +# the problem while rewriting Makefile.in. +@GT_YES@intlh.inst: intlh.inst.in ../config.status +@GT_YES@ cd .. \ +@GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \ +@GT_YES@ $(SHELL) ./config.status +@GT_NO@.PHONY: intlh.inst +@GT_NO@intlh.inst: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gnu/usr.bin/texinfo/intl/VERSION b/gnu/usr.bin/texinfo/intl/VERSION new file mode 100644 index 00000000000..7d069b886d6 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.10.27 diff --git a/gnu/usr.bin/texinfo/intl/bindtextdom.c b/gnu/usr.bin/texinfo/intl/bindtextdom.c new file mode 100644 index 00000000000..72583f25783 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/bindtextdom.c @@ -0,0 +1,175 @@ +/* bindtextdom.c -- implementation of the bindtextdomain(3) function + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy ((Src), (Dst), (Num)) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +#else +# define BINDTEXTDOMAIN bindtextdomain__ +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + struct binding *binding; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + return NULL; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (dirname == NULL) + /* The current binding has be to returned. */ + return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; + + if (binding != NULL) + { + /* The domain is already bound. Replace the old binding. */ + char *new_dirname; + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_dirname = (char *) _nl_default_dirname; + else + { + size_t len = strlen (dirname) + 1; + new_dirname = (char *) malloc (len); + if (new_dirname == NULL) + return NULL; + + memcpy (new_dirname, dirname, len); + } + + if (strcmp (binding->dirname, _nl_default_dirname) != 0) + free (binding->dirname); + + binding->dirname = new_dirname; + } + else + { + /* We have to create a new binding. */ + size_t len; + struct binding *new_binding = + (struct binding *) malloc (sizeof (*new_binding)); + + if (new_binding == NULL) + return NULL; + + len = strlen (domainname) + 1; + new_binding->domainname = (char *) malloc (len); + if (new_binding->domainname == NULL) + return NULL; + memcpy (new_binding->domainname, domainname, len); + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_binding->dirname = (char *) _nl_default_dirname; + else + { + len = strlen (dirname) + 1; + new_binding->dirname = (char *) malloc (len); + if (new_binding->dirname == NULL) + return NULL; + memcpy (new_binding->dirname, dirname, len); + } + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + binding = new_binding; + } + + return binding->dirname; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +#endif diff --git a/gnu/usr.bin/texinfo/intl/cat-compat.c b/gnu/usr.bin/texinfo/intl/cat-compat.c new file mode 100644 index 00000000000..4a9a1d898f4 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/cat-compat.c @@ -0,0 +1,252 @@ +/* Compatibility code for gettext-using-catgets interface. + Copyright (C) 1995 Free Software Foundation, Inc. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> + +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# endif +#endif + +#ifdef HAVE_NL_TYPES_H +# include <nl_types.h> +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + +/* The catalog descriptor. */ +static nl_catd catalog = (nl_catd) -1; + +/* Name of the default catalog. */ +static const char default_catalog_name[] = "messages"; + +/* Name of currently used catalog. */ +static const char *catalog_name = default_catalog_name; + +/* Get ID for given string. If not found return -1. */ +static int msg_to_cat_id PARAMS ((const char *msg)); + +/* Substitution for systems lacking this function in their C library. */ +#if !_LIBC && !HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +#endif + + +/* Set currently used domain/catalog. */ +char * +textdomain (domainname) + const char *domainname; +{ + nl_catd new_catalog; + char *new_name; + size_t new_name_len; + char *lang; + +#if HAVE_SETLOCALE && HAVE_LC_MESSAGES && HAVE_SETLOCALE_NULL + lang = setlocale (LC_MESSAGES, NULL); +#else + lang = getenv ("LC_ALL"); + if (lang == NULL || lang[0] == '\0') + { + lang = getenv ("LC_MESSAGES"); + if (lang == NULL || lang[0] == '\0') + lang = getenv ("LANG"); + } +#endif + if (lang == NULL || lang[0] == '\0') + lang = "C"; + + /* See whether name of currently used domain is asked. */ + if (domainname == NULL) + return (char *) catalog_name; + + if (domainname[0] == '\0') + domainname = default_catalog_name; + + /* Compute length of added path element. */ + new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) + + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 + + sizeof (".cat"); + + new_name = (char *) malloc (new_name_len); + if (new_name == NULL) + return NULL; + + strcpy (new_name, PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + /* NLSPATH search didn't work, try absolute path */ + sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, + PACKAGE); + new_catalog = catopen (new_name, 0); + + if (new_catalog == (nl_catd) -1) + { + free (new_name); + return (char *) catalog_name; + } + } + + /* Close old catalog. */ + if (catalog != (nl_catd) -1) + catclose (catalog); + if (catalog_name != default_catalog_name) + free ((char *) catalog_name); + + catalog = new_catalog; + catalog_name = new_name; + + return (char *) catalog_name; +} + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ +#if HAVE_SETENV || HAVE_PUTENV + char *old_val, *new_val, *cp; + size_t new_val_len; + + /* This does not make much sense here but to be compatible do it. */ + if (domainname == NULL) + return NULL; + + /* Compute length of added path element. If we use setenv we don't need + the first byts for NLSPATH=, but why complicate the code for this + peanuts. */ + new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + + old_val = getenv ("NLSPATH"); + if (old_val == NULL || old_val[0] == '\0') + { + old_val = NULL; + new_val_len += 1 + sizeof (LOCALEDIR) - 1 + + sizeof ("/%L/LC_MESSAGES/%N.cat"); + } + else + new_val_len += strlen (old_val); + + new_val = (char *) malloc (new_val_len); + if (new_val == NULL) + return NULL; + +# if HAVE_SETENV + cp = new_val; +# else + cp = stpcpy (new_val, "NLSPATH="); +# endif + + cp = stpcpy (cp, dirname); + cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); + + if (old_val == NULL) + { +# if __STDC__ + stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); +# else + + cp = stpcpy (cp, LOCALEDIR); + stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); +# endif + } + else + stpcpy (cp, old_val); + +# if HAVE_SETENV + setenv ("NLSPATH", new_val, 1); + free (new_val); +# else + putenv (new_val); + /* Do *not* free the environment entry we just entered. It is used + from now on. */ +# endif + +#endif + + return (char *) domainname; +} + +#undef gettext +char * +gettext (msg) + const char *msg; +{ + int msgid; + + if (msg == NULL || catalog == (nl_catd) -1) + return (char *) msg; + + /* Get the message from the catalog. We always use set number 1. + The message ID is computed by the function `msg_to_cat_id' + which works on the table generated by `po-to-tbl'. */ + msgid = msg_to_cat_id (msg); + if (msgid == -1) + return (char *) msg; + + return catgets (catalog, 1, msgid, (char *) msg); +} + +/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries + for the one equal to msg. If it is found return the ID. In case when + the string is not found return -1. */ +static int +msg_to_cat_id (msg) + const char *msg; +{ + int cnt; + + for (cnt = 0; cnt < _msg_tbl_length; ++cnt) + if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) + return _msg_tbl[cnt]._msg_number; + + return -1; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/gnu/usr.bin/texinfo/intl/dcgettext.c b/gnu/usr.bin/texinfo/intl/dcgettext.c new file mode 100644 index 00000000000..9ce1b3a9a1a --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/dcgettext.c @@ -0,0 +1,596 @@ +/* dcgettext.c -- implementation of the dcgettext(3) function + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "hash-string.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# define stpcpy __stpcpy +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) +# include <limits.h> +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) +# include <sys/param.h> +#endif + +#if !defined(PATH_MAX) && defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +const char _nl_default_dirname[] = GNULOCALEDIR; + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, + const char *msgid)); +static const char *category_to_name PARAMS ((int category)); +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)); + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +#else +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + int saved_errno = errno; + + /* If no real MSGID is given return NULL. */ + if (msgid == NULL) + return NULL; + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + defintion left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (binding->dirname[0] == '/') + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + errno = 0; + while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) + { + path_max += PATH_INCR; + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + errno = 0; + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + errno = saved_errno; + return (char *) msgid; + } + + /* We don't want libintl.a to depend on any other library. So + we avoid the non-standard function stpcpy. In GNU C Library + this function is available, though. Also allow the symbol + HAVE_STPCPY to be defined. */ + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + xdomainname = (char *) alloca (strlen (categoryname) + + strlen (domainname) + 5); + ADD_BLOCK (block_list, xdomainname); + /* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ + stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for th translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitely appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + errno = saved_errno; + return (char *) msgid; + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname); + + if (domain != NULL) + { + retval = find_msg (domain, msgid); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = find_msg (domain->successor[cnt], msgid); + + if (retval != NULL) + break; + } + } + + if (retval != NULL) + { + FREE_BLOCKS (block_list); + errno = saved_errno; + return retval; + } + } + } + /* NOTREACHED */ +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcgettext, dcgettext); +#endif + + +static char * +find_msg (domain_file, msgid) + struct loaded_l10nfile *domain_file; + const char *msgid; +{ + size_t top, act, bottom; + struct loaded_domain *domain; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) == 0) + return (char *) domain->data + W (domain->must_swap, + domain->trans_tab[nstr - 1].offset); + + while (1) + { + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + + nstr = W (domain->must_swap, domain->hash_tab[idx]); + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0) + return (char *) domain->data + + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); + } + /* NOTREACHED */ + } + + /* Now we try the default method: binary search in the sorted + array of messages. */ + bottom = 0; + top = domain->nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset)); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + break; + } + + /* If an translation is found return this. */ + return bottom >= top ? NULL : (char *) domain->data + + W (domain->must_swap, + domain->trans_tab[act].offset); +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char *guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = getenv ("LANGUAGE"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + return setlocale (category, NULL); +#else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* We use C as the default domain. POSIX says this is implementation + defined. */ + return "C"; +#endif +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/gnu/usr.bin/texinfo/intl/dgettext.c b/gnu/usr.bin/texinfo/intl/dgettext.c new file mode 100644 index 00000000000..2fde6770f79 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/dgettext.c @@ -0,0 +1,59 @@ +/* dgettext.c -- implementation of the dgettext(3) function + Copyright (C) 1995 Software Foundation, Inc. + +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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined HAVE_LOCALE_H || defined _LIBC +# include <locale.h> +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT __dcgettext +#else +# define DGETTEXT dgettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/gnu/usr.bin/texinfo/intl/explodename.c b/gnu/usr.bin/texinfo/intl/explodename.c new file mode 100644 index 00000000000..64b0a036c0c --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/explodename.c @@ -0,0 +1,182 @@ +/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdlib.h> +#include <string.h> + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',') + ++cp; + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN sytnax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/gnu/usr.bin/texinfo/intl/finddomain.c b/gnu/usr.bin/texinfo/intl/finddomain.c new file mode 100644 index 00000000000..3b7861e8472 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/finddomain.c @@ -0,0 +1,217 @@ +/* finddomain.c -- handle list of needed message catalogs + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <sys/types.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef strchr +# define strchr index +# endif +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy ((Src), (Dst), (Num)) +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define stpcpy(dest, src) __stpcpy(dest, src) +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +_nl_find_domain (dirname, locale, domainname) + const char *dirname; + char *locale; + const char *domainname; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,sponsor][_revision] + + Beside the first all of them are allowed to be missing. If the + full specified locale is not found, the less specific one are + looked for. The various part will be stripped of according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalzation. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + return retval; +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/gnu/usr.bin/texinfo/intl/gettext.c b/gnu/usr.bin/texinfo/intl/gettext.c new file mode 100644 index 00000000000..7bed6369b44 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/gettext.c @@ -0,0 +1,70 @@ +/* gettext.c -- implementation of gettext(3) function + Copyright (C) 1995 Software Foundation, Inc. + +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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef _LIBC +# define __need_NULL +# include <stddef.h> +#else +# ifdef STDC_HEADERS +# include <stdlib.h> /* Just for NULL. */ +# else +# ifdef HAVE_STRING_H +# include <string.h> +# else +# define NULL ((void *) 0) +# endif +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DGETTEXT __dgettext +#else +# define GETTEXT gettext__ +# define DGETTEXT dgettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DGETTEXT (NULL, msgid); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/gnu/usr.bin/texinfo/intl/gettext.h b/gnu/usr.bin/texinfo/intl/gettext.h new file mode 100644 index 00000000000..5190f09447f --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/gettext.h @@ -0,0 +1,105 @@ +/* gettext.h - internal header for GNU gettext internationalization functions + Copyright (C) 1995 Software Foundation, Inc. + +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 Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include <stdio.h> + +#if HAVE_LIMITS_H || _LIBC +# include <limits.h> +#endif + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have <limits.h>) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/gnu/usr.bin/texinfo/intl/gettextP.h b/gnu/usr.bin/texinfo/intl/gettextP.h new file mode 100644 index 00000000000..bb8d55235ad --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/gettextP.h @@ -0,0 +1,73 @@ +/* Header describing internals of gettext library + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + 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. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include "loadinfo.h" + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +static nls_uint32 SWAP PARAMS ((nls_uint32 i)); + +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} + + +struct loaded_domain +{ + const char *data; + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; +}; + +struct binding +{ + struct binding *next; + char *domainname; + char *dirname; +}; + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname)); +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)); + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/gnu/usr.bin/texinfo/intl/hash-string.h b/gnu/usr.bin/texinfo/intl/hash-string.h new file mode 100644 index 00000000000..ef1f448d865 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/hash-string.h @@ -0,0 +1,62 @@ +/* hash-string - Implements a string hashing function. + Copyright (C) 1995 Free Software Foundation, Inc. + +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. */ + +#ifdef HAVE_VALUES_H +# include <values.h> +#endif + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long) *str++; + g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/gnu/usr.bin/texinfo/intl/intl-compat.c b/gnu/usr.bin/texinfo/intl/intl-compat.c new file mode 100644 index 00000000000..503efa0fa9c --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/intl-compat.c @@ -0,0 +1,76 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995 Software Foundation, Inc. + +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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libgettext.h" + +/* @@ end of prolog @@ */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef textdomain +#undef bindtextdomain + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return bindtextdomain__ (domainname, dirname); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return dcgettext__ (domainname, msgid, category); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return dgettext__ (domainname, msgid); +} + + +char * +gettext (msgid) + const char *msgid; +{ + return gettext__ (msgid); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return textdomain__ (domainname); +} diff --git a/gnu/usr.bin/texinfo/intl/l10nflist.c b/gnu/usr.bin/texinfo/intl/l10nflist.c new file mode 100644 index 00000000000..3611b12904f --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/l10nflist.c @@ -0,0 +1,402 @@ +/* finddomain.c -- handle list of needed message catalogs + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef strchr +# define strchr index +# endif +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy ((Src), (Dst), (Num)) +# endif +#endif + +#if defined _LIBC || defined HAVE_ARGZ_H +# include <argz.h> +#endif +#include <ctype.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define stpcpy(dest, src) __stpcpy(dest, src) +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile *last = NULL; + struct loaded_l10nfile *retval; + char *cp; + size_t entries; + int cnt; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) ? + strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + retval = NULL; + last = NULL; + + /* Construct file name. */ + memcpy (abs_filename, dirlist, dirlist_len); + __argz_stringify (abs_filename, dirlist_len, ':'); + cp = abs_filename + (dirlist_len - 1); + *cp++ = '/'; + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & CEN_SPONSOR) != 0) + { + *cp++ = ','; + cp = stpcpy (cp, sponsor); + } + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + last = NULL; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + last = retval; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + retval = (struct loaded_l10nfile *) + malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) + * (1 << pop (mask)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + retval->decided = (__argz_count (dirlist, dirlist_len) != 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + if (last == NULL) + { + retval->next = *l10nfile_list; + *l10nfile_list = retval; + } + else + { + retval->next = last->next; + last->next = retval; + } + + entries = 0; + /* If the DIRLIST is a real list the RETVAL entry correcponds not to + a real file. So we have to use the DIRLIST separation machanism + of the inner loop. */ + cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; + for (; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, + language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum (codeset[cnt])) + { + ++len; + + if (isalpha (codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha (codeset[cnt])) + *wp++ = tolower (codeset[cnt]); + else if (isdigit (codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/gnu/usr.bin/texinfo/intl/libgettext.h b/gnu/usr.bin/texinfo/intl/libgettext.h new file mode 100644 index 00000000000..c9212aac539 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/libgettext.h @@ -0,0 +1,182 @@ +/* libgettext.h -- Message catalogs for internationalization. + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +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. */ + +/* Because on some systems (e.g. Solaris) we sometimes have to include + the systems libintl.h as well as this file we have more complex + include protection above. But the systems header might perhaps also + define _LIBINTL_H and therefore we have to protect the definition here. */ + +#if !defined (_LIBINTL_H) || !defined (_LIBGETTEXT_H) +#if !defined (_LIBINTL_H) +# define _LIBINTL_H 1 +#endif +#define _LIBGETTEXT_H 1 + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +#include <sys/types.h> + +#if HAVE_LOCALE_H +# include <locale.h> +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef NULL +# if !defined __cplusplus || defined __GNUC__ +# define NULL ((void *) 0) +# else +# define NULL (0) +# endif +#endif + +#if !HAVE_LC_MESSAGES +/* This value determines the behaviour of the gettext() and dgettext() + function. But some system does not have this defined. Define it + to a default value. */ +# define LC_MESSAGES (-1) +#endif + + +/* Declarations for gettext-using-catgets interface. Derived from + Jim Meyering's libintl.h. */ +struct _msg_ent +{ + const char *_msg; + int _msg_number; +}; + + +#if HAVE_CATGETS +/* These two variables are defined in the automatically by po-to-tbl.sed + generated file `cat-id-tbl.c'. */ +extern const struct _msg_ent _msg_tbl[]; +extern int _msg_tbl_length; +#endif + + +/* For automatical extraction of messages sometimes no real + translation is needed. Instead the string itself is the result. */ +#define gettext_noop(Str) (Str) + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +extern char *gettext PARAMS ((const char *__msgid)); +extern char *gettext__ PARAMS ((const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); +extern char *dgettext__ PARAMS ((const char *__domainname, + const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, + int __category)); +extern char *dcgettext__ PARAMS ((const char *__domainname, + const char *__msgid, int __category)); + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +extern char *textdomain PARAMS ((const char *__domainname)); +extern char *textdomain__ PARAMS ((const char *__domainname)); + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +extern char *bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *bindtextdomain__ PARAMS ((const char *__domainname, + const char *__dirname)); + +#if ENABLE_NLS + +/* Solaris 2.3 has the gettext function but dcgettext is missing. + So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 + has dcgettext. */ +# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) + +# define gettext(Msgid) \ + dgettext (NULL, Msgid) + +# define dgettext(Domainname, Msgid) \ + dcgettext (Domainname, Msgid, LC_MESSAGES) + +# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +/* This global variable is defined in loadmsgcat.c. We need a sign, + whether a new catalog was loaded, which can be associated with all + translations. */ +extern int _nl_msg_cat_cntr; + +# define dcgettext(Domainname, Msgid, Category) \ + (__extension__ \ + ({ \ + char *__result; \ + if (__builtin_constant_p (Msgid)) \ + { \ + static char *__translation__; \ + static int __catalog_counter__; \ + if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ + { \ + __translation__ = \ + dcgettext__ ((Domainname), (Msgid), (Category)); \ + __catalog_counter__ = _nl_msg_cat_cntr; \ + } \ + __result = __translation__; \ + } \ + else \ + __result = dcgettext__ ((Domainname), (Msgid), (Category)); \ + __result; \ + })) +# endif +# endif + +#else + +# define gettext(Msgid) (Msgid) +# define dgettext(Domainname, Msgid) (Msgid) +# define dcgettext(Domainname, Msgid, Category) (Msgid) +# define textdomain(Domainname) while (0) /* nothing */ +# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */ + +#endif + +/* @@ begin of epilog @@ */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gnu/usr.bin/texinfo/intl/linux-msg.sed b/gnu/usr.bin/texinfo/intl/linux-msg.sed new file mode 100644 index 00000000000..5918e720a9a --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/linux-msg.sed @@ -0,0 +1,100 @@ +# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# 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. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# Mitch's old catalog format does not allow comments. +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { + s/msgid[ ]*"// +# +# This does not work now with the new format. +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/# \1/ +# Clear substitution flag. + tb +# Append the next line. + :b + N +# Look whether second part is continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that D includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ + tb +} +d diff --git a/gnu/usr.bin/texinfo/intl/loadinfo.h b/gnu/usr.bin/texinfo/intl/loadinfo.h new file mode 100644 index 00000000000..c67c2eb2e8e --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/loadinfo.h @@ -0,0 +1,58 @@ +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, + size_t name_len)); + +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + + +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); diff --git a/gnu/usr.bin/texinfo/intl/loadmsgcat.c b/gnu/usr.bin/texinfo/intl/loadmsgcat.c new file mode 100644 index 00000000000..4b98ec80671 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/loadmsgcat.c @@ -0,0 +1,199 @@ +/* loadmsgcat.c -- load needed message catalogs + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC +# include <sys/mman.h> +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define fstat __fstat +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr; + + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +_nl_load_domain (domain_file) + struct loaded_l10nfile *domain_file; +{ + int fd; + struct stat st; + struct mo_file_header *data = (struct mo_file_header *) -1; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + int use_mmap = 0; +#endif + struct loaded_domain *domain; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if (fstat (fd, &st) != 0 + && st.st_size < (off_t) sizeof (struct mo_file_header)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, st.st_size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (data != (struct mo_file_header *) -1) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + off_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (st.st_size); + if (data == NULL) + return; + + to_read = st.st_size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb == -1) + { + close (fd); + return; + } + + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) + { + /* The magic number is wrong: not a message catalog file. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, st.st_size); + else +#endif + free (data); + return; + } + + domain_file->data + = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain_file->data == NULL) + return; + + domain = (struct loaded_domain *) domain_file->data; + domain->data = (char *) data; + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an illegal revision. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, st.st_size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Show that one domain is changed. This might make some cached + translations invalid. */ + ++_nl_msg_cat_cntr; +} diff --git a/gnu/usr.bin/texinfo/intl/localealias.c b/gnu/usr.bin/texinfo/intl/localealias.c new file mode 100644 index 00000000000..a869acf6a6c --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/localealias.c @@ -0,0 +1,376 @@ +/* localealias.c -- handle aliases for locale names + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ctype.h> +#include <stdio.h> +#include <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef strchr +# define strchr index +# endif +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy ((Src), (Dst), (Num)) +# endif +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp +#endif + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static struct alias_map *map; +static size_t nmap = 0; +static size_t maxmap = 0; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)); +static void extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path = LOCALE_ALIAS_PATH; + struct alias_map *retval; + size_t added; + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + return retval->value; + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == ':') + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + + return NULL; +} + + +static size_t +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); + ADD_BLOCK (block_list, full_fname); + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); + + fp = fopen (full_fname, "r"); + if (fp == NULL) + { + FREE_BLOCKS (block_list); + return 0; + } + + added = 0; + while (!feof (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + char buf[BUFSIZ]; + char *alias; + char *value; + char *cp; + + if (fgets (buf, BUFSIZ, fp) == NULL) + /* EOF reached. */ + break; + + cp = buf; + /* Ignore leading white space. */ + while (isspace (cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace (cp[0])) + ++cp; + + if (cp[0] != '\0') + { + char *tp; + size_t len; + + value = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + extend_alias_table (); + + /* We cannot depend on strdup available in the libc. Sigh! */ + len = strlen (alias) + 1; + tp = (char *) malloc (len); + if (tp == NULL) + { + FREE_BLOCKS (block_list); + return added; + } + memcpy (tp, alias, len); + map[nmap].alias = tp; + + len = strlen (value) + 1; + tp = (char *) malloc (len); + if (tp == NULL) + { + FREE_BLOCKS (block_list); + return added; + } + memcpy (tp, value, len); + map[nmap].value = tp; + + ++nmap; + ++added; + } + } + + /* Possibily not the whole line fitted into the buffer. Ignore + the rest of the line. */ + while (strchr (cp, '\n') == NULL) + { + cp = buf; + if (fgets (buf, BUFSIZ, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + *cp = '\n'; + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + FREE_BLOCKS (block_list); + return added; +} + + +static void +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) malloc (new_size + * sizeof (struct alias_map)); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return; + + memcpy (new_map, map, nmap * sizeof (struct alias_map)); + + if (maxmap != 0) + free (map); + + map = new_map; + maxmap = new_size; +} + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/gnu/usr.bin/texinfo/intl/po2tbl.sed.in b/gnu/usr.bin/texinfo/intl/po2tbl.sed.in new file mode 100644 index 00000000000..b3bcca4d730 --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/po2tbl.sed.in @@ -0,0 +1,102 @@ +# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# 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. +# +1 { + i\ +/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ +\ +#if HAVE_CONFIG_H\ +# include <config.h>\ +#endif\ +\ +#include "libgettext.h"\ +\ +const struct _msg_ent _msg_tbl[] = { + h + s/.*/0/ + x +} +# +# Write msgid entries in C array form. +# +/^msgid/ { + s/msgid[ ]*\(".*"\)/ {\1/ + tb +# Append the next line + :b + N +# Look whether second part is continuation line. + s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ +# Yes, then branch. + ta +# Because we assume that the input file correctly formed the line +# just read cannot be again be a msgid line. So it's safe to ignore +# it. + s/\(.*\)\n.*/\1/ + bc +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ +# Some buggy seds do not clear the `successful substitution since last ``t''' +# flag on `N', so we do a `t' here to clear it. + tb +# Not reached + :c + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)\n\([0-9]*\)/\1, \2},/ + s/\(.*\)"$/\1/ + p +} +# +# Last line. +# +$ { + i\ +};\ + + g + s/0*\(.*\)/int _msg_tbl_length = \1;/p +} +d diff --git a/gnu/usr.bin/texinfo/intl/textdomain.c b/gnu/usr.bin/texinfo/intl/textdomain.c new file mode 100644 index 00000000000..09530b8f75b --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/textdomain.c @@ -0,0 +1,101 @@ +/* textdomain.c -- implementation of the textdomain(3) function + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy ((Src), (Dst), (Num)) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[]; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +#else +# define TEXTDOMAIN textdomain__ +#endif + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *old; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + old = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + _nl_current_default_domain = _nl_default_default_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ + size_t len = strlen (domainname) + 1; + char *cp = (char *) malloc (len); + if (cp != NULL) + memcpy (cp, domainname, len); + _nl_current_default_domain = cp; + } + + if (old != _nl_default_default_domain) + free (old); + + return (char *) _nl_current_default_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/gnu/usr.bin/texinfo/intl/xopen-msg.sed b/gnu/usr.bin/texinfo/intl/xopen-msg.sed new file mode 100644 index 00000000000..b19c0bbd0ec --- /dev/null +++ b/gnu/usr.bin/texinfo/intl/xopen-msg.sed @@ -0,0 +1,104 @@ +# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +# +# 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. +# +# +# The first directive in the .msg should be the definition of the +# message set number. We use always set number 1. +# +1 { + i\ +$set 1 # Automatically created by po2msg.sed + h + s/.*/0/ + x +} +# +# We copy all comments into the .msg file. Perhaps they can help. +# +/^#/ s/^#[ ]*/$ /p +# +# We copy the original message as a comment into the .msg file. +# +/^msgid/ { +# Does not work now +# /"$/! { +# s/\\$// +# s/$/ ... (more lines following)"/ +# } + s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ + p +} +# +# The .msg file contains, other then the .po file, only the translations +# but each given a unique ID. Starting from 1 and incrementing by 1 for +# each message we assign them to the messages. +# It is important that the .po file used to generate the cat-id-tbl.c file +# (with po-to-tbl) is the same as the one used here. (At least the order +# of declarations must not be changed.) +# +/^msgstr/ { + s/msgstr[ ]*"\(.*\)"/\1/ + x +# The following nice solution is by +# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de> + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x +# Bring the line in the format `<number> <message>' + G + s/^[^\n]*$/& / + s/\(.*\)\n\([0-9]*\)/\2 \1/ +# Clear flag from last substitution. + tb +# Append the next line. + :b + N +# Look whether second part is a continuation line. + s/\(.*\n\)"\(.*\)"/\1\2/ +# Yes, then branch. + ta + P + D +# Note that `D' includes a jump to the start!! +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use the sed command `D' here + s/.*\n\(.*\)/\1/ + tb +} +d diff --git a/gnu/usr.bin/texinfo/lib/Makefile.am b/gnu/usr.bin/texinfo/lib/Makefile.am new file mode 100644 index 00000000000..aec88db7246 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/Makefile.am @@ -0,0 +1,15 @@ +## Makefile.am for texinfo/lib. +## $Id: Makefile.am,v 1.1 1997/08/01 21:59:40 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +noinst_LIBRARIES = libtxi.a +INCLUDES = -I../intl + +# Don't need to list alloca.c, etc., Automake includes them. +libtxi_a_SOURCES = getopt.c getopt.h getopt1.c system.h xmalloc.c xstrdup.c +libtxi_a_LIBADD = @LIBOBJS@ @ALLOCA@ +libtxi_a_DEPENDENCIES = $(libtxi_a_LIBADD) + +## xx configure for bzero?, clib, other common stuff + +EXTRA_DIST = README diff --git a/gnu/usr.bin/texinfo/lib/Makefile.in b/gnu/usr.bin/texinfo/lib/Makefile.in new file mode 100644 index 00000000000..9ee77493f24 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/Makefile.in @@ -0,0 +1,260 @@ +# Makefile.in generated automatically by automake 1.2 from Makefile.am + +# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = true +PRE_INSTALL = true +POST_INSTALL = true +NORMAL_UNINSTALL = true +PRE_UNINSTALL = true +POST_UNINSTALL = true +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +GENCAT = @GENCAT@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GT_NO = @GT_NO@ +GT_YES = @GT_YES@ +INSTOBJEXT = @INSTOBJEXT@ +INTLDEPS = @INTLDEPS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +PACKAGE = @PACKAGE@ +POFILES = @POFILES@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +TERMLIBS = @TERMLIBS@ +TEXCONFIG = @TEXCONFIG@ +TEXMF = @TEXMF@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +l = @l@ + +noinst_LIBRARIES = libtxi.a +INCLUDES = -I../intl + +# Don't need to list alloca.c, etc., Automake includes them. +libtxi_a_SOURCES = getopt.c getopt.h getopt1.c system.h xmalloc.c xstrdup.c +libtxi_a_LIBADD = @LIBOBJS@ @ALLOCA@ +libtxi_a_DEPENDENCIES = $(libtxi_a_LIBADD) + +EXTRA_DIST = README +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libtxi_a_OBJECTS = getopt.o getopt1.o xmalloc.o xstrdup.o +AR = ar +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) +LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = README Makefile.am Makefile.in alloca.c memcpy.c \ +memmove.c strdup.c strerror.c + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP = --best +SOURCES = $(libtxi_a_SOURCES) +OBJECTS = $(libtxi_a_OBJECTS) + +default: all + +.SUFFIXES: +.SUFFIXES: .c .o +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps lib/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.c.o: + $(COMPILE) -c $< + +mostlyclean-compile: + rm -f *.o core + +clean-compile: + +distclean-compile: + rm -f *.tab.c + +maintainer-clean-compile: + +libtxi.a: $(libtxi_a_OBJECTS) $(libtxi_a_DEPENDENCIES) + rm -f libtxi.a + $(AR) cru libtxi.a $(libtxi_a_OBJECTS) $(libtxi_a_LIBADD) + $(RANLIB) libtxi.a + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) + here=`pwd` && cd $(srcdir) && mkid -f$$here/ID $(SOURCES) $(HEADERS) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) + tags=; \ + here=`pwd`; \ + test -z "$(ETAGS_ARGS)$(SOURCES)$(HEADERS)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $(SOURCES) $(HEADERS) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = lib + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file; \ + done +alloca.o alloca.lo: alloca.c +getopt.o getopt.lo: getopt.c ../config.h ../intl/libintl.h getopt.h +getopt1.o getopt1.lo: getopt1.c ../config.h ../intl/libintl.h getopt.h +memcpy.o memcpy.lo: memcpy.c +memmove.o memmove.lo: memmove.c +strdup.o strdup.lo: strdup.c +strerror.o strerror.lo: strerror.c +xmalloc.o xmalloc.lo: xmalloc.c +xstrdup.o xstrdup.lo: xstrdup.c ../config.h + +info: +dvi: +check: all + $(MAKE) +installcheck: +install-exec: + @$(NORMAL_INSTALL) + +install-data: + @$(NORMAL_INSTALL) + +install: install-exec install-data all + @: + +uninstall: + +all: Makefile $(LIBRARIES) + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install +installdirs: + + +mostlyclean-generic: + test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + rm -f Makefile $(DISTCLEANFILES) + rm -f config.cache config.log stamp-h stamp-h[0-9]* + test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) + test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +clean: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ + mostlyclean + +distclean: distclean-noinstLIBRARIES distclean-compile distclean-tags \ + distclean-generic clean + rm -f config.status + +maintainer-clean: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +.PHONY: default mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info dvi installcheck \ +install-exec install-data install uninstall all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gnu/usr.bin/texinfo/lib/README b/gnu/usr.bin/texinfo/lib/README new file mode 100644 index 00000000000..04ae4817aa9 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/README @@ -0,0 +1,3 @@ +Common routines to the Texinfo package. +Many are common to other GNU packages as well. +(On the FSF machines, check /gd/gnu/lib for the latest.) diff --git a/gnu/usr.bin/texinfo/lib/alloca.c b/gnu/usr.bin/texinfo/lib/alloca.c new file mode 100644 index 00000000000..8f98b73dbb9 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/alloca.c @@ -0,0 +1,504 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant <jot@cray.com> contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef emacs +#include "blockinput.h" +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +#ifndef alloca + +#ifdef emacs +#ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +#ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +#endif /* STACK_DIRECTION undefined */ +#endif /* static */ +#endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#if __STDC__ +typedef void *pointer; +#else +typedef char *pointer; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* Different portions of Emacs need to call different versions of + malloc. The Emacs executable needs alloca to call xmalloc, because + ordinary malloc isn't protected from input signals. On the other + hand, the utilities in lib-src need alloca to call malloc; some of + them are very simple, and don't have an xmalloc routine. + + Non-Emacs programs expect this to call use xmalloc. + + Callers below should use malloc. */ + +#ifndef emacs +#define malloc xmalloc +#endif +extern pointer malloc (); + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +#ifndef STACK_DIRECTION +#define STACK_DIRECTION 0 /* Direction unknown. */ +#endif + +#if STACK_DIRECTION != 0 + +#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +#else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +#define STACK_DIR stack_dir + +static void +find_stack_direction () +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +#ifndef ALIGN_SIZE +#define ALIGN_SIZE sizeof(double) +#endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +pointer +alloca (size) + unsigned size; +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +#endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +#ifdef emacs + BLOCK_INPUT; +#endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free ((pointer) hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +#ifdef emacs + UNBLOCK_INPUT; +#endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + register pointer new = malloc (sizeof (header) + size); + /* Address of header. */ + + if (new == 0) + abort(); + + ((header *) new)->h.next = last_alloca_header; + ((header *) new)->h.deep = depth; + + last_alloca_header = (header *) new; + + /* User storage begins just after header. */ + + return (pointer) ((char *) new + sizeof (header)); + } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include <stdio.h> +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +#endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ + +#endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/gnu/usr.bin/texinfo/lib/getopt.c b/gnu/usr.bin/texinfo/lib/getopt.c new file mode 100644 index 00000000000..300f86de3eb --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/getopt.c @@ -0,0 +1,1053 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +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. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +#define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if !defined (__STDC__) || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +#include <stdlib.h> +#include <unistd.h> +#endif /* GNU C library. */ + +#ifdef VMS +#include <unixlib.h> +#if HAVE_STRING_H - 0 +#include <string.h> +#endif +#endif + +#if defined (WIN32) && !defined (__CYGWIN32__) +/* It's not Unix, really. See? Capital letters. */ +#include <windows.h> +#define getpid() GetCurrentProcessId() +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +#ifdef HAVE_LIBINTL_H +# include <libintl.h> +# define _(msgid) gettext (msgid) +#else +# define _(msgid) (msgid) +#endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +#include <string.h> +#define my_index strchr +#else + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +char *getenv (); + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +#if !defined (__STDC__) || !__STDC__ +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +#endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +extern pid_t __libc_pid; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +text_set_element (__libc_subinit, store_args_and_env); + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined (__STDC__) && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len); + memset (&new_str[nonoption_flags_max_len], '\0', + top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined (__STDC__) && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + { + memcpy (__getopt_nonoption_flags, orig_str, len); + memset (&__getopt_nonoption_flags[len], '\0', + nonoption_flags_max_len - len); + } + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/gnu/usr.bin/texinfo/lib/getopt.h b/gnu/usr.bin/texinfo/lib/getopt.h new file mode 100644 index 00000000000..69256fd3864 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/getopt.h @@ -0,0 +1,133 @@ +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +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. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if defined (__STDC__) && __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if defined (__STDC__) && __STDC__ +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GETOPT_H */ diff --git a/gnu/usr.bin/texinfo/lib/getopt1.c b/gnu/usr.bin/texinfo/lib/getopt1.c new file mode 100644 index 00000000000..6507ba1b1f6 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/getopt1.c @@ -0,0 +1,189 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +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. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "getopt.h" + +#if !defined (__STDC__) || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include <stdio.h> + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/gnu/usr.bin/texinfo/lib/memcpy.c b/gnu/usr.bin/texinfo/lib/memcpy.c new file mode 100644 index 00000000000..521625464cd --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/memcpy.c @@ -0,0 +1,20 @@ +/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined + if the source overlaps with the destination. + Return DESTADDR. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +char * +memcpy (destaddr, srcaddr, len) + char *destaddr; + const char *srcaddr; + int len; +{ + char *dest = destaddr; + + while (len-- > 0) + *destaddr++ = *srcaddr++; + return dest; +} diff --git a/gnu/usr.bin/texinfo/lib/memmove.c b/gnu/usr.bin/texinfo/lib/memmove.c new file mode 100644 index 00000000000..d7bdd7cd995 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/memmove.c @@ -0,0 +1,24 @@ +/* memmove.c -- copy memory. + Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate. + In the public domain. + By David MacKenzie <djm@gnu.ai.mit.edu>. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +void +memmove (dest, source, length) + char *dest; + const char *source; + unsigned length; +{ + if (source < dest) + /* Moving from low mem to hi mem; start at end. */ + for (source += length, dest += length; length; --length) + *--dest = *--source; + else if (source != dest) + /* Moving from hi mem to low mem; start at beginning. */ + for (; length; --length) + *dest++ = *source++; +} diff --git a/gnu/usr.bin/texinfo/lib/strdup.c b/gnu/usr.bin/texinfo/lib/strdup.c new file mode 100644 index 00000000000..1d60f13948a --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/strdup.c @@ -0,0 +1,43 @@ +/* strdup.c -- return a newly allocated copy of a string + Copyright (C) 1990 Free Software Foundation, Inc. + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef STDC_HEADERS +#include <string.h> +#include <stdlib.h> +#else +char *malloc (); +char *strcpy (); +#endif + +/* Return a newly allocated copy of STR, + or 0 if out of memory. */ + +char * +strdup (str) + const char *str; +{ + char *newstr; + + newstr = (char *) malloc (strlen (str) + 1); + if (newstr) + strcpy (newstr, str); + return newstr; +} diff --git a/gnu/usr.bin/texinfo/lib/strerror.c b/gnu/usr.bin/texinfo/lib/strerror.c new file mode 100644 index 00000000000..661469173d9 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/strerror.c @@ -0,0 +1,43 @@ +/* + * strerror.c --- ANSI C compatible system error routine + */ + +/* + * Copyright (C) 1986, 1988, 1989, 1991 the Free Software Foundation, Inc. + * From gawk. + * + * 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 0 +#include <stdio.h> +#endif + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(n) +int n; +{ + static char mesg[30]; + + if (n < 0 || n >= sys_nerr) { + sprintf(mesg, "Unknown error (%d)", n); + return mesg; + } else + return sys_errlist[n]; +} diff --git a/gnu/usr.bin/texinfo/lib/system.h b/gnu/usr.bin/texinfo/lib/system.h new file mode 100644 index 00000000000..c9edd9ff8df --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/system.h @@ -0,0 +1,102 @@ +/* system.h: System-dependent declarations. Include this first. + $Id: system.h,v 1.1 1997/08/01 21:59:40 kstailey Exp $ + + Copyright (C) 1997 Free Software Foundation, Inc. + + 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. */ + +#ifndef TEXINFO_SYSTEM_H +#define TEXINFO_SYSTEM_H + +#define _GNU_SOURCE + +#include <config.h> + +/* <unistd.h> should be included before any preprocessor test + of _POSIX_VERSION. */ +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif /* HAVE_UNISTD_H */ + +#include <stdio.h> +#include <sys/types.h> +#include <ctype.h> + +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#include <libintl.h> + +/* Don't use bcopy! Use memmove if source and destination may overlap, + memcpy otherwise. */ +#ifdef HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#else +# include <strings.h> +char *memchr (); +#endif + +#ifdef STDC_HEADERS +#define getopt system_getopt +#include <stdlib.h> +#undef getopt +#else +extern char *getenv (); +#endif + +#ifndef HAVE_STRERROR +extern char *strerror (); +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif +#ifdef VMS +#include <perror.h> +#endif + +#include <sys/stat.h> + +#ifdef HAVE_SYS_FILE_H +#include <sys/file.h> +#endif /* HAVE_SYS_FILE_H */ + +#ifndef O_RDONLY +/* Since <fcntl.h> is POSIX, prefer that to <sys/fcntl.h>. + This also avoids some useless warnings on (at least) Linux. */ +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#else /* not HAVE_FCNTL_H */ +#ifdef HAVE_SYS_FCNTL_H +#include <sys/fcntl.h> +#endif /* not HAVE_SYS_FCNTL_H */ +#endif /* not HAVE_FCNTL_H */ +#endif /* not O_RDONLY */ + +#ifdef HAVE_PWD_H +#include <pwd.h> +#endif +/* Some systems don't declare this function in pwd.h. */ +struct passwd *getpwnam (); + +/* Our library routines not included in any system library. */ +extern void *xmalloc (), *xrealloc (); +extern char *xstrdup (); + +#endif /* TEXINFO_SYSTEM_H */ diff --git a/gnu/usr.bin/texinfo/lib/xmalloc.c b/gnu/usr.bin/texinfo/lib/xmalloc.c new file mode 100644 index 00000000000..156989ed711 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/xmalloc.c @@ -0,0 +1,80 @@ +/* xmalloc.c -- safe versions of malloc and realloc */ + +/* This file is part of GNU Info, a program for reading online documentation + stored in Info format. + + This file has appeared in prior works by the Free Software Foundation; + thus it carries copyright dates from 1988 through 1993. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993 Free Software + Foundation, Inc. + + 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. + + Written by Brian Fox (bfox@ai.mit.edu). */ + +#if !defined (ALREADY_HAVE_XMALLOC) +#include <stdio.h> +#include <sys/types.h> + +extern void *malloc (), *realloc (); +static void memory_error_and_abort (); + +/* **************************************************************** */ +/* */ +/* Memory Allocation and Deallocation. */ +/* */ +/* **************************************************************** */ + +/* Return a pointer to free()able block of memory large enough + to hold BYTES number of bytes. If the memory cannot be allocated, + print an error message and abort. */ +void * +xmalloc (bytes) + int bytes; +{ + void *temp = malloc (bytes); + + if (!temp) + memory_error_and_abort ("xmalloc"); + return (temp); +} + +void * +xrealloc (pointer, bytes) + void *pointer; + int bytes; +{ + void *temp; + + if (!pointer) + temp = malloc (bytes); + else + temp = realloc (pointer, bytes); + + if (!temp) + memory_error_and_abort ("xrealloc"); + + return (temp); +} + +static void +memory_error_and_abort (fname) + char *fname; +{ + fprintf (stderr, "%s: Out of virtual memory!\n", fname); + abort (); +} +#endif /* !ALREADY_HAVE_XMALLOC */ diff --git a/gnu/usr.bin/texinfo/lib/xstrdup.c b/gnu/usr.bin/texinfo/lib/xstrdup.c new file mode 100644 index 00000000000..d5bcaf38091 --- /dev/null +++ b/gnu/usr.bin/texinfo/lib/xstrdup.c @@ -0,0 +1,42 @@ +/* xstrdup.c -- copy a string with out of memory checking + Copyright (C) 1990, 1996 Free Software Foundation, Inc. + + 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 HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined(STDC_HEADERS) || defined(HAVE_STRING_H) +# include <string.h> +#else +# include <strings.h> +#endif + +#if defined (__STDC__) && __STDC__ +char *xmalloc (size_t); +char *xstrdup (char *string); +#else +char *xmalloc (); +#endif + +/* Return a newly allocated copy of STRING. */ + +char * +xstrdup (string) + char *string; +{ + return strcpy (xmalloc (strlen (string) + 1), string); +} diff --git a/gnu/usr.bin/texinfo/makeinfo/Makefile.am b/gnu/usr.bin/texinfo/makeinfo/Makefile.am new file mode 100644 index 00000000000..3e341fb62cc --- /dev/null +++ b/gnu/usr.bin/texinfo/makeinfo/Makefile.am @@ -0,0 +1,13 @@ +## Makefile.am for texinfo/makeinfo. +## $Id: Makefile.am,v 1.1 1997/08/01 22:00:54 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +bin_PROGRAMS = makeinfo + +localedir = $(datadir)/locale +INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\" +LDADD = ../lib/libtxi.a @INTLLIBS@ + +makeinfo_SOURCES = makeinfo.c makeinfo.h multi.c + +EXTRA_DIST = README diff --git a/gnu/usr.bin/texinfo/makeinfo/README b/gnu/usr.bin/texinfo/makeinfo/README new file mode 100644 index 00000000000..8b404caaf6d --- /dev/null +++ b/gnu/usr.bin/texinfo/makeinfo/README @@ -0,0 +1,6 @@ +A standalone program to convert Texinfo source into Info files +readable with standalone info or M-x info in Emacs. +makeinfo can also output plain ASCII. + +The Emacs function M-x texinfo-format-buffer does the same job, but +makeinfo is faster and gives better error messages. diff --git a/gnu/usr.bin/texinfo/missing b/gnu/usr.bin/texinfo/missing new file mode 100644 index 00000000000..a6abd069801 --- /dev/null +++ b/gnu/usr.bin/texinfo/missing @@ -0,0 +1,134 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard <pinard@iro.umontreal.ca>, 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 touch file \`y.tab.c' + makeinfo touch the output file + yacc touch file \`y.tab.c'" + ;; + + -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." + touch config.h.in + ;; + + 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$/touch \1.in/' \ + | sh + ;; + + 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." + touch y.tab.c + ;; + + 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=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + 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 --git a/gnu/usr.bin/texinfo/mkinstalldirs b/gnu/usr.bin/texinfo/mkinstalldirs new file mode 100644 index 00000000000..db46c289b06 --- /dev/null +++ b/gnu/usr.bin/texinfo/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 1997/08/01 21:59:38 kstailey Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/gnu/usr.bin/texinfo/po/ChangeLog b/gnu/usr.bin/texinfo/po/ChangeLog new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/gnu/usr.bin/texinfo/po/ChangeLog diff --git a/gnu/usr.bin/texinfo/po/Makefile.in.in b/gnu/usr.bin/texinfo/po/Makefile.in.in new file mode 100644 index 00000000000..85b346369a6 --- /dev/null +++ b/gnu/usr.bin/texinfo/po/Makefile.in.in @@ -0,0 +1,254 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996 Free Software Foundation, Inc. +# +# 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. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = $(prefix)/share/gettext/po +subdir = po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ + +CC = @CC@ +GENCAT = @GENCAT@ +GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ +MSGMERGE = PATH=../src:$$PATH msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +SOURCES = cat-id-tbl.c +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +INSTOBJEXT = @INSTOBJEXT@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && $(GENCAT) $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: cat-id-tbl.c $(CATALOGS) +all-no: + +$(PACKAGE).pot: $(POTFILES) + $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=$(srcdir)/POTFILES.in + if [ ! -s $(PACKAGE).po ] \ + || cmp -s $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; then \ + rm -f $(PACKAGE).po; \ + else \ + rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot; \ + fi + +cat-id-tbl.c: stamp-cat-id +stamp-cat-id: $(PACKAGE).pot + rm -f cat-id-tbl.tmp + sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ + | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp + if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ + rm cat-id-tbl.tmp; \ + else \ + echo cat-id-tbl.c changed; \ + rm -f $(srcdir)/cat-id-tbl.c; \ + mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ + fi + cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(datadir); \ + else \ + $(top_srcdir)/mkinstalldirs $(datadir); \ + fi + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + case "$$cat" in \ + *.gmo) destdir=$(gnulocaledir);; \ + *) destdir=$(localedir);; \ + esac; \ + lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \ + dir=$$destdir/$$lang/LC_MESSAGES; \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $$dir; \ + else \ + $(top_srcdir)/mkinstalldirs $$dir; \ + fi; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + fi; \ + if test -r $$cat.m; then \ + $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + if test -r $(srcdir)/$$cat.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$cat.m \ + $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + true; \ + fi; \ + fi; \ + done + if test "$(PACKAGE)" = "gettext"; then \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + cd $(srcdir) && \ + $(INSTALL_DATA) Makefile.in.in $(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + done + rm -f $(gettextsrcdir)/po-Makefile.in.in + +check: all + +cat-id-tbl.o: ../intl/libgettext.h + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: update-po $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(PACKAGE).pot + PATH=`pwd`/../src:$$PATH; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \ + mv $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ + rm -f $$lang.old.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$lang.po; \ + mv $$lang.old.po $$lang.po; \ + fi; \ + done + +POTFILES: POTFILES.in + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ + posrcprefix="../"; \ + fi; \ + sed -e '/^#/d' -e '/^[ ]*$$/d' \ + -e "s@.*@ $$posrcprefix& \\\\@" \ + -e '$$s/\(.*\) \\/\1/' < $(srcdir)/POTFILES.in > POTFILES ) + +Makefile: Makefile.in.in ../config.status POTFILES + cd .. \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gnu/usr.bin/texinfo/po/POTFILES.in b/gnu/usr.bin/texinfo/po/POTFILES.in new file mode 100644 index 00000000000..3efaaac8d02 --- /dev/null +++ b/gnu/usr.bin/texinfo/po/POTFILES.in @@ -0,0 +1,20 @@ +# List of source files containing translatable strings. +# The last line must not be a comment. + +info/doc.c +info/echo-area.c +info/footnotes.c +info/indices.c +info/info.c +info/infodoc.c +info/m-x.c +info/makedoc.c +info/nodemenu.c +info/nodes.h +info/session.c +info/variables.c +info/window.c +makeinfo/makeinfo.c +makeinfo/multi.c +util/install-info.c +util/texindex.c diff --git a/gnu/usr.bin/texinfo/po/cat-id-tbl.c b/gnu/usr.bin/texinfo/po/cat-id-tbl.c new file mode 100644 index 00000000000..8e7d2b04ee0 --- /dev/null +++ b/gnu/usr.bin/texinfo/po/cat-id-tbl.c @@ -0,0 +1,501 @@ +/* Automatically generated by po2tbl.sed from texinfo.pot. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libgettext.h" + +const struct _msg_ent _msg_tbl[] = { + {"", 1}, + {"Move down to the next line", 2}, + {"Move up to the previous line", 3}, + {"Move to the end of the line", 4}, + {"Move to the start of the line", 5}, + {"Move forward a character", 6}, + {"Move backward a character", 7}, + {"Move forward a word", 8}, + {"Move backward a word", 9}, + {"Move forwards or down through node structure", 10}, + {"Move backwards or up through node structure", 11}, + {"Scroll forward in this window", 12}, + {"Scroll backward in this window", 13}, + {"Move to the start of this node", 14}, + {"Move to the end of this node", 15}, + {"Select the next window", 16}, + {"Select the previous window", 17}, + {"Split the current window", 18}, + {"Delete the current window", 19}, + {"Delete all other windows", 20}, + {"Scroll the other window", 21}, + {"Grow (or shrink) this window", 22}, + {"Divide the available screen space among the visible windows", 23}, + {"Toggle the state of line wrapping in the current window", 24}, + {"Select the `Next' node", 25}, + {"Select the `Prev' node", 26}, + {"Select the `Up' node", 27}, + {"Select the last node in this file", 28}, + {"Select the first node in this file", 29}, + {"Select the most recently selected node", 30}, + {"Select the last item in this node's menu", 31}, + {"Select this menu item", 32}, + {"Read a menu item and select its node", 33}, + {"Read a footnote or cross reference and select its node", 34}, + {"Move to the start of this node's menu", 35}, + {"Visit as many menu items at once as possible", 36}, + {"Read a node name and select it", 37}, + {"Read a manpage reference and select it", 38}, + {"Select the node `Top' in this file", 39}, + {"Select the node `(dir)'", 40}, + {"Kill this node", 41}, + {"Read the name of a file and select it", 42}, + {"Pipe the contents of this node through INFO_PRINT_COMMAND", 43}, + {"Read a string and search for it", 44}, + {"Search interactively for a string as you type it", 45}, + {"Move to the previous cross reference", 46}, + {"Move to the next cross reference", 47}, + {"Select reference or menu item appearing on this line", 48}, + {"Cancel current operation", 49}, + {"Move to the cursor to a specific line of the window", 50}, + {"Redraw the display", 51}, + {"Quit using Info", 52}, + {"Add this digit to the current numeric argument", 53}, + {"universal-argument", 54}, + {"Start (or multiply by 4) the current numeric argument", 55}, + {"Internally used by \\[universal-argument]", 56}, + {"Move to the start of this line", 57}, + {"Move to the end of this line", 58}, + {"Delete the character under the cursor", 59}, + {"Delete the character behind the cursor", 60}, + {"Cancel or quit operation", 61}, + {"Accept (or force completion of) this line", 62}, + {"Insert next character verbatim", 63}, + {"Insert this character", 64}, + {"Insert a TAB character", 65}, + {"Transpose characters at point", 66}, + {"Yank back the contents of the last kill", 67}, + {"Yank back a previous kill", 68}, + {"Kill to the end of the line", 69}, + {"Kill to the beginning of the line", 70}, + {"Kill the word following the cursor", 71}, + {"Kill the word preceding the cursor", 72}, + {"List possible completions", 73}, + {"Insert completion", 74}, + {"Scroll the completions window", 75}, + {"Display help message", 76}, + {"Visit Info node `(info)Help'", 77}, + {"Print documentation for KEY", 78}, + {"Show what to type to execute a given command", 79}, + {"Read the name of an Info command and describe it", 80}, + {"Read a command name in the echo area and execute it", 81}, + {"Set the height of the displayed window", 82}, + {"Look up a string in the index for this file", 83}, + {"\ +Go to the next matching index item from the last `\\[index-search]' command", 84}, + {"Grovel all known info file's indices for a string and build a menu", 85}, + {"Make a window containing a menu of all of the currently visited nodes", 86}, + {"Select a node which has been previously visited in a visible window", 87}, + {"Show the footnotes associated with this node in another window", 88}, + {"Explain the use of a variable", 89}, + {"Set the value of an Info variable", 90}, + {"Kill ring is empty", 91}, + {"Not complete", 92}, + {"No completions", 93}, + {"Sole completion", 94}, + {"There %s %d ", 95}, + {"is", 96}, + {"are", 97}, + {"completion%s:\n", 98}, + {"Building completions...", 99}, + {"Footnotes could not be displayed", 100}, + {"Finding index entries...", 101}, + {"No indices found.", 102}, + {"Index entry: ", 103}, + {"No previous index search string.", 104}, + {"No index entries.", 105}, + {"No %sindex entries containing \"%s\".", 106}, + {"more ", 107}, + {"CAN'T SEE THIS", 108}, + {"Found \"%s\" in %s. (`\\[next-index-match]' tries to find next.)", 109}, + {"Scanning indices of \"%s\"...", 110}, + {"Index apropos: ", 111}, + {"\ +\n\ +* Menu: Nodes whoses indices contain \"%s\":\n", 112}, + {"no entries found\n", 113}, + {"There is no menu in this node.", 114}, + {"There is no menu item \"%s\" in this node.", 115}, + {"Unable to find the node referenced by \"%s\".", 116}, + {"\ +Usage: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]...", 117}, + {"\ + [--directory dir-path] [--file info-file] [--node node-name]...", 118}, + {" [--help] [--output output-file] [--subnodes] [--version]", 119}, + {" [--dribble dribble-file] [--restore from-file]", 120}, + {" [menu-selection ...]", 121}, + {"\ +Here is a quick description of Info's options. For a more complete\n\ +description of how to use Info, type `info info options'.\n\ +\n\ + --directory DIR Add DIR to INFOPATH.\n\ + --dribble FILENAME Remember user keystrokes in FILENAME.\n\ + --file FILENAME Specify Info file to visit.\n\ + --node NODENAME Specify nodes in first visited Info file.\n\ + --output FILENAME Output selected nodes to FILENAME.\n\ + --restore FILENAME Read initial keystrokes from FILENAME.\n\ + --subnodes Recursively output menu items.\n\ + --help Get this help message.\n\ + --version Display Info's version information.\n\ +\n\ +Remaining arguments to Info are treated as the names of menu\n\ +items in the initial node visited. You can easily move to the\n\ +node of your choice by specifying the menu names which describe\n\ +the path to that node. For example, `info emacs buffers'.\n\ +\n\ +Email bug reports to bug-texinfo@prep.ai.mit.edu.", 122}, + {"Basic Commands in Info Windows", 123}, + {"\ +The following commands can only be invoked via M-x:\n\ +\n", 124}, + {"--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n", 125}, + {"Describe key: %s", 126}, + {"ESC %s is undefined.", 127}, + {"%s is undefined.", 128}, + {"%s is defined to %s.", 129}, + {"Where is command: ", 130}, + {"`%s' is not on any keys", 131}, + {"%s can only be invoked via %s.", 132}, + {"%s can be invoked via %s.", 133}, + {"There is no function named `%s'", 134}, + {"Describe command: ", 135}, + {"Cannot execute an `echo-area' command here.", 136}, + {"Set screen height to (%d): ", 137}, + {"\ + Source files groveled to make this file include:\n\ +\n", 138}, + {"Couldn't manipulate the file %s.\n", 139}, + {"\ +\n\ +* Menu:\n\ + (File)Node Lines Size Containing File\n\ + ---------- ----- ---- ---------------", 140}, + {"\ +Here is the menu of nodes you have recently visited.\n\ +Select one from this menu, or use `\\[history-node]' in another window.\n", 141}, + {"Select visited node: ", 142}, + {"The reference disappeared! (%s).", 143}, + {"\ +Welcome to Info version %s. \"\\[get-help-window]\" for help, \ +\"\\[menu-item]\" for menu item.", 144}, + {" times", 145}, + {"%d times", 146}, + {"No \"Next\" pointer for this node.", 147}, + {"Following \"Next\" node...", 148}, + {"Next", 149}, + {"Selecting first menu item...", 150}, + {"Selecting \"Next\" node...", 151}, + {"Up", 152}, + {"No more nodes.", 153}, + {"No \"Prev\" for this node.", 154}, + {"Moving \"Prev\" in this window.", 155}, + {"Prev", 156}, + {"No \"Prev\" or \"Up\" for this node.", 157}, + {"Moving \"Up\" in this window.", 158}, + {"Moving to \"Prev\"'s last menu item.", 159}, + {"Cannot delete a permanent window", 160}, + {"This window has no additional nodes", 161}, + {"There aren't %d items in this menu.", 162}, + {"Menu item (%s): ", 163}, + {"Menu item: ", 164}, + {"Follow xref (%s): ", 165}, + {"Follow xref: ", 166}, + {"Goto Node: ", 167}, + {"Get Manpage: ", 168}, + {"Top", 169}, + {"Kill node (%s): ", 170}, + {"Cannot kill node `%s'", 171}, + {"Cannot kill the last node", 172}, + {"Find file: ", 173}, + {"Cannot find \"%s\".", 174}, + {"Could not create output file \"%s\".", 175}, + {"Done.", 176}, + {"Writing node \"(%s)%s\"...", 177}, + {"Writing node \"%s\"...", 178}, + {"Cannot open pipe to \"%s\".", 179}, + {"Printing node \"(%s)%s\"...", 180}, + {"Printing node \"%s\"...", 181}, + {"Searching subfile \"%s\"...", 182}, + {"%s for string [%s]: ", 183}, + {"Search backward", 184}, + {"Search", 185}, + {"Search failed.", 186}, + {"I-search backward: ", 187}, + {"I-search: ", 188}, + {"Failing ", 189}, + {"No cross references in this node.", 190}, + {"Quit", 191}, + {"Unknown command (%s).", 192}, + {"\"\" is invalid", 193}, + {"\"%s\" is invalid", 194}, + {"When \"On\", footnotes appear and disappear automatically", 195}, + {"When \"On\", creating or deleting a window resizes other windows", 196}, + {"When \"On\", flash the screen instead of ringing the bell", 197}, + {"When \"On\", errors cause the bell to ring", 198}, + {"When \"On\", Info garbage collects files which had to be uncompressed", 199}, + {"When \"On\", the portion of the matched search string is highlighted", 200}, + {"Controls what happens when scrolling is requested at the end of a node", 201}, + {"The number lines to scroll when the cursor moves out of the window", 202}, + {"When \"On\", Info accepts and displays ISO Latin characters", 203}, + {"Describe variable: ", 204}, + {"Set variable: ", 205}, + {"Set %s to value (%d): ", 206}, + {"Set %s to value (%s): ", 207}, + {"--*** Tags out of Date ***", 208}, + {"-----Info: (), lines ----, ", 209}, + {"-%s---Info: %s, %d lines --%s--", 210}, + {"-%s%s-Info: (%s)%s, %d lines --%s--", 211}, + {" Subfile: %s", 212}, + {"%s:%d: warning: ", 213}, + {"Too many errors! Gave up.\n", 214}, + {"%s: %s arg must be numeric, not `%s'.\n", 215}, + {"Couldn't open macro expansion output `%s'", 216}, + {"Cannot specify more than one macro expansion output", 217}, + {"%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n", 218}, + {"%s: --footnote-style arg must be `separate' or `end', not `%s'.\n", 219}, + {"\ +Copyright (C) 1996 Free Software Foundation, Inc.\n\ +There is NO warranty. You may redistribute this software\n\ +under the terms of the GNU General Public License.\n\ +For more information about these matters, see the files named COPYING.", 220}, + {"%s: missing file argument.\n", 221}, + {"makeinfo (GNU %s %s) %d.%d\n", 222}, + {"Try `%s --help' for more information.\n", 223}, + {"\ +Usage: %s [OPTION]... TEXINFO-FILE...\n\ +\n\ +Translate Texinfo source documentation to a format suitable for reading\n\ +with GNU Info.\n\ +\n\ +Options:\n\ +-D VAR define a variable, as with @set.\n\ +-E MACRO-OFILE process macros only, output texinfo source.\n\ +-I DIR append DIR to the @include directory search path.\n\ +-P DIR prepend DIR to the @include directory search path.\n\ +-U VAR undefine a variable, as with @clear.\n\ +--error-limit NUM quit after NUM errors (default %d).\n\ +--fill-column NUM break lines at NUM characters (default %d).\n\ +--footnote-style STYLE output footnotes according to STYLE:\n\ + `separate' to place footnotes in their own node,\n\ + `end' to place the footnotes at the end of\n\ + the node in which they are defined (the default).\n\ +--force preserve output even if errors.\n\ +--help display this help and exit.\n\ +--no-validate suppress node cross-reference validation.\n\ +--no-warn suppress warnings (but not errors).\n\ +--no-split suppress splitting of large files.\n\ +--no-headers suppress node separators and Node: Foo headers.\n\ +--output FILE, -o FILE output to FILE, and ignore any @setfilename.\n\ +--paragraph-indent VAL indent paragraphs with VAL spaces (default %d).\n\ + if VAL is `none', do not indent; if VAL is `asis',\n\ + preserve any existing indentation.\n\ +--reference-limit NUM complain about at most NUM references (default %d).\n\ +--verbose report about what is being done.\n\ +--version display version information and exit.\n\ +\n\ +Email bug reports to bug-texinfo@prep.ai.mit.edu.\n", 224}, + {"%s: getwd: %s, %s\n", 225}, + {"Expected `%s'", 226}, + {"No `%s' found in `%s'", 227}, + {"%s: Skipping macro expansion to stdout as Info output is going there.\n", 228}, + {"Making %s file `%s' from `%s'.\n", 229}, + {"This is Info file %s, produced by Makeinfo version %d.%d", 230}, + {" from the input file %s.\n", 231}, + {"\ +%s: Removing macro output file `%s' due to errors; use --force to preserve.\n", 232}, + {"%s: Removing output file `%s' due to errors; use --force to preserve.\n", 233}, + {"Misplaced %c", 234}, + {"Unknown command `%s'", 235}, + {"NO_NAME!", 236}, + {"%c%s expected `{...}'", 237}, + {"Unmatched }", 238}, + {"%c%s missing close brace", 239}, + {"Broken-Type in insertion_type_pname", 240}, + {"Enumeration stack overflow", 241}, + {"lettering overflow, restarting at %c", 242}, + {"* Menu:\n", 243}, + {"%s requires an argument: the formatter for %citem", 244}, + {"`%cend' expected `%s', but saw `%s'", 245}, + {"No matching `%cend %s'", 246}, + {"How did @%s end up in cm_special_char?\n", 247}, + {"%c%s expects `i' or `j' as argument, not `%c'", 248}, + {"%c%s expects a single character `i' or `j' as argument", 249}, + {"January", 250}, + {"February", 251}, + {"March", 252}, + {"April", 253}, + {"May", 254}, + {"June", 255}, + {"July", 256}, + {"August", 257}, + {"September", 258}, + {"October", 259}, + {"November", 260}, + {"December", 261}, + {"%d %s %d", 262}, + {"%c%s expects a single character as an argument", 263}, + {"%c%s is obsolete", 264}, + {"There already is a node having %ctop as a section", 265}, + {"Here is the %ctop node", 266}, + {"%ctop used before %cnode, defaulting to %s", 267}, + {"%c%s is obsolete; use %c%s instead", 268}, + {"Node `%s' multiply defined (line %d is first definition at)", 269}, + {"Formatting node %s...\n", 270}, + {"Node `%s' requires a sectioning command (e.g. %c%s)", 271}, + {"Node `%s''s Next field not pointed back to", 272}, + {"This node (`%s') is the one with the bad `Prev'", 273}, + {"Node `%s's Prev field not pointed back to", 274}, + {"This node (`%s') has the bad Next", 275}, + {"Node `%s' missing Up field", 276}, + {"`%s' has an Up field of `%s', but `%s' has no menu item for `%s'", 277}, + {"node `%s' has been referenced %d times", 278}, + {"unreferenced node `%s'", 279}, + {"%s reference to nonexistent node `%s'", 280}, + {"%cmenu seen before first node", 281}, + {"creating `Top' node", 282}, + {"`.' or `,' must follow cross reference, not %c", 283}, + {"@image file `%s' unreadable: %s", 284}, + {"@image missing filename argument", 285}, + {"%s requires letter or digit", 286}, + {"Unmatched `%c%s'", 287}, + {"`%c%s' needs something after it", 288}, + {"Bad argument to `%s', `%s', using `%s'", 289}, + {"{No Value For \"%s\"}", 290}, + {"%c%s requires a name", 291}, + {"Reached eof before matching @end %s", 292}, + {"The `%c%s' command is meaningless within a `@%s' block", 293}, + {"%citemx is not meaningful inside of a `%s' block", 294}, + {"%c%s found outside of an insertion block", 295}, + {"Missing `}' in %cdef arg", 296}, + {"Function", 297}, + {"Macro", 298}, + {"Special Form", 299}, + {"Variable", 300}, + {"User Option", 301}, + {"Instance Variable", 302}, + {"Method", 303}, + {"Must be in a `%s' insertion in order to use `%s'x", 304}, + {"%csp requires a positive numeric argument", 305}, + {"asis", 306}, + {"none", 307}, + {"Bad argument to %c%s", 308}, + {"Unknown index `%s'", 309}, + {"Index `%s' already exists", 310}, + {"Unknown index `%s' and/or `%s' in @synindex", 311}, + {"Unknown index `%s' in @printindex", 312}, + {"\ +* Menu:\n\ +\n", 313}, + {"`%c%s' needs an argument `{...}', not just `%s'", 314}, + {"No closing brace for footnote `%s'", 315}, + {"Footnote defined without parent node", 316}, + {"-Footnotes", 317}, + {"\ +---------- Footnotes ----------\n\ +\n", 318}, + {"macro `%s' previously defined", 319}, + {"here is the previous definition of `%s'", 320}, + {"Macro `%s' called with too many args", 321}, + {"%cend macro not found", 322}, + {"%cquote-arg only useful when the macro takes a single argument", 323}, + {"ignoring stray text `%s' after @multitable", 324}, + {"Too many columns in multitable item (max %d)", 325}, + {"multitable item not in active multitable", 326}, + {"Cannot select column #%d in multitable", 327}, + {"ignoring @tab outside of multitable", 328}, + {"** Multicolumn output from last row:\n", 329}, + {"* column #%d: output = %s\n", 330}, + {"virtual memory exhausted", 331}, + {"%s: warning: ", 332}, + {" for %s", 333}, + {"\tTry `%s --help' for a complete list of options.\n", 334}, + {"\ +%s [OPTION]... [INFO-FILE [DIR-FILE]]\n\ + Install INFO-FILE in the Info directory file DIR-FILE.\n\ +\n\ +Options:\n\ +--delete Delete existing entries in INFO-FILE;\n\ + don't insert any new entries.\n\ +--dir-file=NAME Specify file name of Info directory file.\n\ + This is equivalent to using the DIR-FILE argument.\n\ +--entry=TEXT Insert TEXT as an Info directory entry.\n\ + TEXT should have the form of an Info menu item line\n\ + plus zero or more extra lines starting with whitespace.\n\ + If you specify more than one entry, they are all added.\n\ + If you don't specify any entries, they are determined\n\ + from information in the Info file itself.\n\ +--help Display this help and exit.\n\ +--info-file=FILE Specify Info file to install in the directory.\n\ + This is equivalent to using the INFO-FILE argument.\n\ +--info-dir=DIR Same as --dir-file=DIR/dir.\n\ +--item=TEXT Same as --entry TEXT.\n\ + An Info directory entry is actually a menu item.\n\ +--quiet Suppress warnings.\n\ +--remove Same as --delete.\n\ +--section=SEC Put this file's entries in section SEC of the directory.\n\ + If you specify more than one section, all the entries\n\ + are added in each of the sections.\n\ + If you don't specify any sections, they are determined\n\ + from information in the Info file itself.\n\ +--version Display version information and exit.\n\ +\n\ +Email bug reports to bug-texinfo@prep.ai.mit.edu.\n", 335}, + {"\ +This is the file .../info/dir, which contains the\n\ +topmost node of the Info hierarchy, called (dir)Top.\n\ +The first time you invoke Info you start off looking at this node.\n\ +\n\ +File: dir Node: Top This is the top of the INFO tree\n\ +\n\ + This (the Directory node) gives a menu of major topics.\n\ + Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n\ + \"h\" gives a primer for first-timers,\n\ + \"mEmacs<Return>\" visits the Emacs manual, etc.\n\ +\n\ + In Emacs, you can click mouse button 2 on a menu item or cross reference\n\ + to select it.\n\ +\n\ +* Menu:\n", 336}, + {"%s: could not read (%s) and could not create (%s)\n", 337}, + {"%s: Specify the Info directory only once.\n", 338}, + {"%s: Specify the Info file only once.\n", 339}, + {"install-info (GNU %s) %s\n", 340}, + {"excess command line argument `%s'", 341}, + {"No input file specified; try --help for more information.", 342}, + {"No dir file specified; try --help for more information.", 343}, + {"START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY", 344}, + {"END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY", 345}, + {"no info dir entry in `%s'", 346}, + {"menu item `%s' already exists, for file `%s'", 347}, + {"no entries found for `%s'; nothing deleted", 348}, + {"keep temporary files around after processing", 349}, + {"do not keep temporary files around after processing (default)", 350}, + {"send output to FILE", 351}, + {"display version information and exit", 352}, + {"display this help and exit", 353}, + {"Usage: %s [OPTION]... FILE...\n", 354}, + {"Generate a sorted index for each TeX output FILE.\n", 355}, + {"Usually FILE... is `foo.??' for a document `foo.texi'.\n", 356}, + {"\ +\n\ +Options:\n", 357}, + {"\ +\n\ +Email bug reports to bug-texinfo@prep.ai.mit.edu.", 358}, + {"texindex (GNU %s %s) 2.1\n", 359}, + {"%s: not a texinfo index file", 360}, + {"failure reopening %s", 361}, + {"entry %s follows an entry with a secondary name", 362}, + {"%s; for file `%s'.\n", 363}, + {"Virtual memory exhausted in %s ()! Needed %d bytes.", 364}, +}; + diff --git a/gnu/usr.bin/texinfo/po/de.gmo b/gnu/usr.bin/texinfo/po/de.gmo Binary files differnew file mode 100644 index 00000000000..b99834b5e5c --- /dev/null +++ b/gnu/usr.bin/texinfo/po/de.gmo diff --git a/gnu/usr.bin/texinfo/po/de.po b/gnu/usr.bin/texinfo/po/de.po new file mode 100644 index 00000000000..444ea5703c7 --- /dev/null +++ b/gnu/usr.bin/texinfo/po/de.po @@ -0,0 +1,2233 @@ +# German messages for the GNU Texinfo package. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Karl Eichwalder <ke@ke.central.de>, 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU Texinfo 3.9bPOT-Creation-Date: 1997-07-11 " +"11:21-0400PO-Revision-Date: 1996-12-17 21:27 METLast-Translator: Karl " +"Eichwalder <ke@ke.central.de>Language-Team: German <de@li.org>MIME-Version: " +"1.0Content-Type: text/plain; charset=ISO-8859-1Content-Transfer-Encoding: " +"8-bitPOT-Creation-Date: 1997-07-13 17:12-0400POT-Creation-Date: 1997-07-13 " +"17:12-0400POT-Creation-Date: 1997-07-13 17:12-0400POT-Creation-Date: " +"1997-07-13 17:12-0400POT-Creation-Date: 1997-07-15 " +"14:50-0400POT-Creation-Date: 1997-07-15 14:50-0400POT-Creation-Date: " +"1997-07-15 15:35-0400POT-Creation-Date: 1997-07-15 " +"15:35-0400POT-Creation-Date: 1997-07-17 17:50-0400POT-Creation-Date: " +"1997-07-18 10:40-0400POT-Creation-Date: 1997-07-19 " +"17:19-0400POT-Creation-Date: 1997-07-20 08:19-0400POT-Creation-Date: " +"1997-07-20 08:19-0400POT-Creation-Date: 1997-07-20 " +"08:19-0400POT-Creation-Date: 1997-07-25 17:57-0400POT-Creation-Date: " +"1997-07-25 17:57-0400POT-Creation-Date: 1997-07-29 " +"18:04-0400POT-Creation-Date: 1997-07-31 17:43-0400POT-Creation-Date: " +"1997-07-31 17:43-0400\n" + +#. Commands found in "./session.c". +#: info/doc.c:27 info/session.c:629 +#, fuzzy +msgid "Move down to the next line" +msgstr "Zum Ende dieser Zeile bewegen" + +#. Move WINDOW's point up to the previous line if possible. +#: info/doc.c:28 info/session.c:644 +#, fuzzy +msgid "Move up to the previous line" +msgstr "Zum Ende dieser Zeile bewegen" + +#. Move WINDOW's point to the end of the true line. +#: info/doc.c:29 info/session.c:659 +#, fuzzy +msgid "Move to the end of the line" +msgstr "Zum Ende dieser Zeile bewegen" + +#. Move WINDOW's point to the beginning of the true line. +#: info/doc.c:30 info/session.c:679 +#, fuzzy +msgid "Move to the start of the line" +msgstr "Zum Anfang dieser Zeile bewegen" + +#. Commands found in "./echo-area.c". +#: info/doc.c:31 info/doc.c:84 info/echo-area.c:283 info/session.c:698 +msgid "Move forward a character" +msgstr "Ein Zeichen vorwärts bewegen" + +#. Move point backward in the node. +#: info/doc.c:32 info/doc.c:85 info/echo-area.c:295 info/session.c:714 +msgid "Move backward a character" +msgstr "Ein Zeichen rückwärts bewegen" + +#. Move forward a word in the input line. +#: info/doc.c:33 info/doc.c:88 info/echo-area.c:320 info/session.c:732 +msgid "Move forward a word" +msgstr "Ein Wort vorwärts bewegen" + +#: info/doc.c:34 info/doc.c:89 info/echo-area.c:360 info/session.c:781 +msgid "Move backward a word" +msgstr "Ein Wort rückwärts bewegen" + +#: info/doc.c:35 info/session.c:1121 +msgid "Move forwards or down through node structure" +msgstr "" + +#: info/doc.c:36 info/session.c:1137 +msgid "Move backwards or up through node structure" +msgstr "" + +# checkit +#. Show the next screen of WINDOW's node. +#: info/doc.c:37 info/session.c:1152 +#, fuzzy +msgid "Scroll forward in this window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +# checkit +#. Show the previous screen of WINDOW's node. +#: info/doc.c:38 info/session.c:1197 +#, fuzzy +msgid "Scroll backward in this window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +#. Move to the beginning of the node. +#: info/doc.c:39 info/session.c:1237 +#, fuzzy +msgid "Move to the start of this node" +msgstr "Zum Anfang dieser Zeile bewegen" + +#. Move to the end of the node. +#: info/doc.c:40 info/session.c:1244 +#, fuzzy +msgid "Move to the end of this node" +msgstr "Zum Ende dieser Zeile bewegen" + +# checkit +#. **************************************************************** +#. +#. Commands for Manipulating Windows +#. +#. **************************************************************** +#. Make the next window in the chain be the active window. +#: info/doc.c:41 info/session.c:1257 +#, fuzzy +msgid "Select the next window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +# checkit +#. Make the previous window in the chain be the active window. +#: info/doc.c:42 info/session.c:1296 +#, fuzzy +msgid "Select the previous window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +# checkit +#. Split WINDOW into two windows, both showing the same node. If we +#. are automatically tiling windows, re-tile after the split. +#: info/doc.c:43 info/session.c:1347 +#, fuzzy +msgid "Split the current window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +# checkit +#. Delete WINDOW, forgetting the list of last visited nodes. If we are +#. automatically displaying footnotes, show or remove the footnotes +#. window. If we are automatically tiling windows, re-tile after the +#. deletion. +#: info/doc.c:44 info/session.c:1428 +#, fuzzy +msgid "Delete the current window" +msgstr "Das Zeichen hinter dem Cursor löschen" + +#. Just keep WINDOW, deleting all others. +#: info/doc.c:45 info/session.c:1469 +msgid "Delete all other windows" +msgstr "" + +# checkit +#. Scroll the "other" window of WINDOW. +#: info/doc.c:46 info/session.c:1515 +#, fuzzy +msgid "Scroll the other window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +#. Change the size of WINDOW by AMOUNT. +#: info/doc.c:47 info/session.c:1535 +msgid "Grow (or shrink) this window" +msgstr "" + +#: info/doc.c:48 info/session.c:1546 +msgid "Divide the available screen space among the visible windows" +msgstr "" + +#: info/doc.c:49 info/session.c:1553 +msgid "Toggle the state of line wrapping in the current window" +msgstr "" + +#. Make WINDOW display the "Next:" node of the node currently being +#. displayed. +#: info/doc.c:50 info/session.c:1714 +msgid "Select the `Next' node" +msgstr "" + +#. Make WINDOW display the "Prev:" node of the node currently being +#. displayed. +#: info/doc.c:51 info/session.c:1722 +msgid "Select the `Prev' node" +msgstr "" + +#. Make WINDOW display the "Up:" node of the node currently being +#. displayed. +#: info/doc.c:52 info/session.c:1730 +msgid "Select the `Up' node" +msgstr "" + +#. Make WINDOW display the last node of this info file. +#: info/doc.c:53 info/session.c:1737 +#, fuzzy +msgid "Select the last node in this file" +msgstr "Zum Anfang dieser Zeile bewegen" + +#. Make WINDOW display the first node of this info file. +#: info/doc.c:54 info/session.c:1759 +msgid "Select the first node in this file" +msgstr "" + +#: info/doc.c:55 info/session.c:2401 +msgid "Select the most recently selected node" +msgstr "" + +#: info/doc.c:56 info/session.c:1778 +#, fuzzy +msgid "Select the last item in this node's menu" +msgstr "Es sind keine %d Punkte in diesem Menu." + +#. Use KEY (a digit) to select the Nth menu item in WINDOW->node. +#: info/doc.c:57 info/session.c:1784 +#, fuzzy +msgid "Select this menu item" +msgstr "Ersten Menupunkt auswählen..." + +#. Read a line (with completion) which is the name of a menu item, +#. and select that item. +#: info/doc.c:58 info/session.c:2042 +#, fuzzy +msgid "Read a menu item and select its node" +msgstr "Es gibt keinen Menupunkt »%s« in diesem Node." + +#: info/doc.c:59 info/session.c:2050 +msgid "Read a footnote or cross reference and select its node" +msgstr "" + +#. Position the cursor at the start of this node's menu. +#: info/doc.c:60 info/session.c:2056 +#, fuzzy +msgid "Move to the start of this node's menu" +msgstr "Zum Anfang dieser Zeile bewegen" + +#: info/doc.c:61 info/session.c:2080 +msgid "Visit as many menu items at once as possible" +msgstr "" + +#. Read a line of input which is a node name, and go to that node. +#: info/doc.c:62 info/session.c:2108 +#, fuzzy +msgid "Read a node name and select it" +msgstr "Lies einen Befehlsnamen in der »Echo-Area« und führe ihn aus" + +#: info/doc.c:63 info/session.c:2194 +#, fuzzy +msgid "Read a manpage reference and select it" +msgstr "Lies einen Befehlsnamen in der »Echo-Area« und führe ihn aus" + +#. Move to the "Top" node in this file. +#: info/doc.c:64 info/session.c:2228 +#, fuzzy +msgid "Select the node `Top' in this file" +msgstr "Zum Ende dieser Zeile bewegen" + +#. Move to the node "(dir)Top". +#: info/doc.c:65 info/session.c:2234 +msgid "Select the node `(dir)'" +msgstr "" + +#. Kill named node. +#: info/doc.c:66 info/session.c:2407 +msgid "Kill this node" +msgstr "" + +#. Read the name of a file and select the entire file. +#: info/doc.c:67 info/session.c:2415 +#, fuzzy +msgid "Read the name of a file and select it" +msgstr "Lese den Namen eines Info-Befehls und beschreibe ihn" + +#: info/doc.c:68 info/session.c:2634 +msgid "Pipe the contents of this node through INFO_PRINT_COMMAND" +msgstr "" + +#: info/doc.c:69 info/session.c:2946 +msgid "Read a string and search for it" +msgstr "" + +#: info/doc.c:70 info/doc.c:71 info/session.c:3020 info/session.c:3026 +msgid "Search interactively for a string as you type it" +msgstr "" + +#: info/doc.c:72 info/session.c:3579 +msgid "Move to the previous cross reference" +msgstr "" + +#: info/doc.c:73 info/session.c:3588 +#, fuzzy +msgid "Move to the next cross reference" +msgstr "Zum Ende dieser Zeile bewegen" + +#: info/doc.c:74 info/session.c:3598 +msgid "Select reference or menu item appearing on this line" +msgstr "" + +# checkit +#. **************************************************************** +#. +#. Miscellaneous Info Commands +#. +#. **************************************************************** +#. What to do when C-g is pressed in a window. +#: info/doc.c:75 info/session.c:3620 +msgid "Cancel current operation" +msgstr "Momentane Operation abbrechen" + +#: info/doc.c:76 info/session.c:3636 +msgid "Move to the cursor to a specific line of the window" +msgstr "" + +#. Clear the screen and redraw its contents. Given a numeric argument, +#. move the line the cursor is on to the COUNT'th line of the window. +#: info/doc.c:77 info/session.c:3668 +msgid "Redraw the display" +msgstr "" + +#. This command does nothing. It is the fact that a key is bound to it +#. that has meaning. See the code at the top of info_session (). +#: info/doc.c:78 info/session.c:3705 +msgid "Quit using Info" +msgstr "" + +#: info/doc.c:80 info/session.c:3958 +msgid "Add this digit to the current numeric argument" +msgstr "" + +#: info/doc.c:81 +msgid "universal-argument" +msgstr "" + +#: info/doc.c:81 info/session.c:3967 +msgid "Start (or multiply by 4) the current numeric argument" +msgstr "" + +#: info/doc.c:82 info/session.c:3982 +msgid "Internally used by \\[universal-argument]" +msgstr "" + +#: info/doc.c:86 info/echo-area.c:307 +msgid "Move to the start of this line" +msgstr "Zum Anfang dieser Zeile bewegen" + +#: info/doc.c:87 info/echo-area.c:312 +msgid "Move to the end of this line" +msgstr "Zum Ende dieser Zeile bewegen" + +#: info/doc.c:90 info/echo-area.c:400 +msgid "Delete the character under the cursor" +msgstr "Das Zeichen unter dem Cursor löschen" + +# checkit +#: info/doc.c:91 info/echo-area.c:430 +msgid "Delete the character behind the cursor" +msgstr "Das Zeichen hinter dem Cursor löschen" + +#: info/doc.c:92 info/echo-area.c:451 +msgid "Cancel or quit operation" +msgstr "Operation abbrechen oder beenden" + +#: info/doc.c:93 info/echo-area.c:466 +msgid "Accept (or force completion of) this line" +msgstr "Akzeptiere diese Zeile (oder erzwinge ihre Vervollständigung)" + +#: info/doc.c:94 info/echo-area.c:471 +msgid "Insert next character verbatim" +msgstr "Das nächste Zeichen wörtlich eingeben" + +#: info/doc.c:95 info/echo-area.c:479 +msgid "Insert this character" +msgstr "Dieses Zeichen eingeben" + +# checkit +#: info/doc.c:96 info/echo-area.c:497 +msgid "Insert a TAB character" +msgstr "Ein TAB-Zeichen eingeben" + +#. Transpose the characters at point. If point is at the end of the line, +#. then transpose the characters before point. +#: info/doc.c:97 info/echo-area.c:504 +msgid "Transpose characters at point" +msgstr "Zeichen am Point umstellen" + +#: info/doc.c:98 info/echo-area.c:555 +msgid "Yank back the contents of the last kill" +msgstr "Füge den Inhalt des letzten Killens ein" + +#. If the last command was yank, or yank_pop, and the text just before +#. point is identical to the current kill item, then delete that text +#. from the line, rotate the index down, and yank back some other text. +#: info/doc.c:99 info/echo-area.c:575 +msgid "Yank back a previous kill" +msgstr "Füge ein vorangehendes Killen ein" + +#. Delete the text from point to end of line. +#: info/doc.c:100 info/echo-area.c:608 +msgid "Kill to the end of the line" +msgstr "Bis zum Ende der Zeile killen" + +#: info/doc.c:101 info/echo-area.c:621 +msgid "Kill to the beginning of the line" +msgstr "Bis zum Anfang der Zeile killen" + +#. Delete from point to the end of the current word. +#: info/doc.c:102 info/echo-area.c:633 +msgid "Kill the word following the cursor" +msgstr "Das dem Cursor folgende Wort killen" + +#: info/doc.c:103 info/echo-area.c:652 +msgid "Kill the word preceding the cursor" +msgstr "Das dem Cursor vorangehende Wort killen" + +#: info/doc.c:104 info/echo-area.c:916 +msgid "List possible completions" +msgstr "Mögliche Vervollständigungen listen" + +#: info/doc.c:105 info/echo-area.c:1090 +msgid "Insert completion" +msgstr "Vervollständigung einfügen" + +# checkit +#. Scroll the "other" window. If there is a window showing completions, scroll +#. that one, otherwise scroll the window which was active on entering the read +#. function. +#: info/doc.c:106 info/echo-area.c:1321 +msgid "Scroll the completions window" +msgstr "Vervollständigungs-Fenster »scrollen«" + +#. Commands found in "./infodoc.c". +#: info/doc.c:108 info/infodoc.c:328 +msgid "Display help message" +msgstr "Diesen Hilfe-Text anzeigen" + +#. Show the Info help node. This means that the "info" file is installed +#. where it can easily be found on your system. +#: info/doc.c:109 info/infodoc.c:346 +msgid "Visit Info node `(info)Help'" +msgstr "Info-Node »(info)Help« besuchen" + +#: info/doc.c:110 info/infodoc.c:470 +msgid "Print documentation for KEY" +msgstr "Dokumentation für KEY ausgeben" + +#: info/doc.c:111 +msgid "Show what to type to execute a given command" +msgstr "Zeige an, was einzugeben ist, um einen gegebenen Befehl auszuführen" + +#. Commands found in "./m-x.c". +#: info/doc.c:113 info/m-x.c:69 +msgid "Read the name of an Info command and describe it" +msgstr "Lese den Namen eines Info-Befehls und beschreibe ihn" + +#: info/doc.c:114 info/m-x.c:96 +msgid "Read a command name in the echo area and execute it" +msgstr "Lies einen Befehlsnamen in der »Echo-Area« und führe ihn aus" + +#: info/doc.c:115 info/m-x.c:150 +msgid "Set the height of the displayed window" +msgstr "Setze die Höhe des angezeigten Fensters" + +#. Commands found in "./indices.c". +#: info/doc.c:117 info/indices.c:175 +msgid "Look up a string in the index for this file" +msgstr "Sieh eine Zeichenkette im Index dieser Datei nach" + +#: info/doc.c:118 info/indices.c:332 +msgid "" +"Go to the next matching index item from the last `\\[index-search]' command" +msgstr "" +"Geh zum nächsten übereinstimmenden Index-Eintrag vom letzten " +"»\\[index-search]«-Befehl" + +#: info/doc.c:119 info/indices.c:616 +msgid "Grovel all known info file's indices for a string and build a menu" +msgstr "" +"Durchsuche durch alle bekannten Info-Datei-Indices nach einer Zeichenkette " +"und bilde ein Menu" + +#. Commands found in "./nodemenu.c". +#: info/doc.c:121 info/nodemenu.c:217 +msgid "Make a window containing a menu of all of the currently visited nodes" +msgstr "" + +#: info/doc.c:122 info/nodemenu.c:297 +msgid "Select a node which has been previously visited in a visible window" +msgstr "" + +#. Commands found in "./footnotes.c". +#: info/doc.c:124 info/footnotes.c:232 +msgid "Show the footnotes associated with this node in another window" +msgstr "Zeige die mit diesem Node verbundenen Fußnoten im anderen Fenster" + +#. Commands found in "./variables.c". +#: info/doc.c:126 info/variables.c:77 +msgid "Explain the use of a variable" +msgstr "" + +#: info/doc.c:127 info/variables.c:102 +#, fuzzy +msgid "Set the value of an Info variable" +msgstr "Lese den Namen eines Info-Befehls und beschreibe ihn" + +# IMO muss "kill" auch im Folgenden wörtlich üs werden -ke- +#: info/echo-area.c:562 +msgid "Kill ring is empty" +msgstr "Der Kill-Ring ist leer" + +# checkit +#: info/echo-area.c:871 +msgid "Not complete" +msgstr "Nicht vollständig" + +#: info/echo-area.c:929 +msgid "No completions" +msgstr "Keine Vervollständigungen" + +#: info/echo-area.c:933 +msgid "Sole completion" +msgstr "Einzige Vervollständigung" + +#: info/echo-area.c:942 +#, c-format +msgid "There %s %d " +msgstr "Da %s %d " + +#: info/echo-area.c:942 +msgid "is" +msgstr "ist" + +#: info/echo-area.c:942 +msgid "are" +msgstr "sind" + +#: info/echo-area.c:945 +#, fuzzy, c-format +msgid "completion%s:\n" +msgstr "Keine Vervollständigungen" + +#: info/echo-area.c:1223 +msgid "Building completions..." +msgstr "Bilde Vervollständigungen..." + +#: info/footnotes.c:206 +msgid "Footnotes could not be displayed" +msgstr "Fußnoten können nicht angezeigt werden" + +#: info/indices.c:205 +msgid "Finding index entries..." +msgstr "Suche Index-Einträge..." + +# checkit +# oder sind "Einträge" gemeint? -ke- +#: info/indices.c:212 +msgid "No indices found." +msgstr "Keine Indices gefunden." + +#: info/indices.c:222 +msgid "Index entry: " +msgstr "Index-Eintrag: " + +#: info/indices.c:342 +msgid "No previous index search string." +msgstr "Keine vorangehende zu suchende Index-Zeichenkette." + +#: info/indices.c:349 +msgid "No index entries." +msgstr "Keine Index-Einträge." + +# checkit +# kann im Deutschen nachgebildet werden, aber... -ke- +#: info/indices.c:382 +#, c-format +msgid "No %sindex entries containing \"%s\"." +msgstr "Keine %sIndex-Einträge beinhalten »%s«." + +#: info/indices.c:383 +msgid "more " +msgstr "weiteren " + +#: info/indices.c:393 +msgid "CAN'T SEE THIS" +msgstr "DIES IST NICHT ZU SEHEN" + +#: info/indices.c:429 +#, c-format +msgid "Found \"%s\" in %s. (`\\[next-index-match]' tries to find next.)" +msgstr "" +"»%s« in %s gefunden. (»\\[next-index-match]« versucht nächsten Eintrag zu " +"finden.)" + +#: info/indices.c:533 +#, c-format +msgid "Scanning indices of \"%s\"..." +msgstr "Index von »%s« wird durchsucht..." + +#: info/indices.c:620 +msgid "Index apropos: " +msgstr "Index apropos: " + +#: info/indices.c:650 +#, c-format +msgid "" +"\n" +"* Menu: Nodes whoses indices contain \"%s\":\n" +msgstr "" +"\n" +"* Menu: Nodes, deren Indices »%s« beinhalten:\n" + +# checkit +# oder sind "Einträge" gemeint? -ke- +#: info/info.c:347 +#, fuzzy +msgid "no entries found\n" +msgstr "Keine Indices gefunden." + +#: info/info.c:390 +msgid "There is no menu in this node." +msgstr "Es gibt kein Menu in diesem Node." + +#: info/info.c:421 +#, c-format +msgid "There is no menu item \"%s\" in this node." +msgstr "Es gibt keinen Menupunkt »%s« in diesem Node." + +#: info/info.c:485 +#, c-format +msgid "Unable to find the node referenced by \"%s\"." +msgstr "Kann keinen von »%s« referenzierten Node finden." + +# Dieser und die folgenden Strings wird nur gebraucht, wenn Fehleingabe vorliegt; +# muss durch `Try `%s --help' ...' ersetzt werden. -ke- +#: info/info.c:595 +msgid "" +"Usage: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]..." +msgstr "" +"Aufruf: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]..." + +#: info/info.c:596 +msgid "" +" [--directory dir-path] [--file info-file] [--node node-name]..." +msgstr "" +" [--directory dir-path] [--file info-file] [--node node-name]..." + +#: info/info.c:597 +msgid " [--help] [--output output-file] [--subnodes] [--version]" +msgstr " [--help] [--output output-file] [--subnodes] [--version]" + +#: info/info.c:598 +msgid " [--dribble dribble-file] [--restore from-file]" +msgstr " [--dribble dribble-file] [--restore from-file]" + +#: info/info.c:599 +msgid " [menu-selection ...]" +msgstr " [menu-selection ...]" + +#: info/info.c:607 +#, fuzzy +msgid "" +"Here is a quick description of Info's options. For a more complete\n" +"description of how to use Info, type `info info options'.\n" +"\n" +" --directory DIR Add DIR to INFOPATH.\n" +" --dribble FILENAME Remember user keystrokes in FILENAME.\n" +" --file FILENAME Specify Info file to visit.\n" +" --node NODENAME Specify nodes in first visited Info file.\n" +" --output FILENAME Output selected nodes to FILENAME.\n" +" --restore FILENAME Read initial keystrokes from FILENAME.\n" +" --subnodes Recursively output menu items.\n" +" --help Get this help message.\n" +" --version Display Info's version information.\n" +"\n" +"Remaining arguments to Info are treated as the names of menu\n" +"items in the initial node visited. You can easily move to the\n" +"node of your choice by specifying the menu names which describe\n" +"the path to that node. For example, `info emacs buffers'.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" +"Für eine ausführlichere Anleitung, wie Info zu benutzen ist, gib\n" +"»info info options« ein.\n" +"\n" +" --directory=VERZ VERZ zu INFOPATH hinzufügen\n" +" --dribble=DATEI Tasteneingaben des Benutzers in DATEI merken\n" +" --file=DATEI zu besuchende Info-DATEI angeben\n" +" --node=NODENAME \"node\" in der ersten zu besuchenden Info-Datei " +"angeben\n" +" --output=DATEI ausgewählte \"nodes\" einer Datei nach DATEI ausgeben\n" +" --restore=DATEI einleitende Tasteneingaben von DATEI lesen\n" +" --subnodes Menupunkte rekursiv ausgeben\n" +" --help diese Hilfe anzeigen\n" +" --version Programmversion anzeigen\n" +"\n" +"Verbleibende Parameter werden als Namen von Menupunkten des zuerst " +"besuchten\n" +"\"nodes\" angesehen. Man kann sich einfach zum gewünschten \"node\" " +"bewegen,\n" +"indem man die Namen der Menupunkte angibt, die den Weg dorthin bezeichnen;\n" +"z. B. »info emacs buffers«.\n" +"\n" +"Fehler (\"bugs\") bitte an <bug-texinfo@prep.ai.mit.edu> melden." + +#: info/infodoc.c:50 +#, fuzzy +msgid "Basic Commands in Info Windows" +msgstr "" +"Verfügbare Befehle im Info-Fenster:\n" +"\n" + +#: info/infodoc.c:211 +msgid "" +"The following commands can only be invoked via M-x:\n" +"\n" +msgstr "Die folgenden Befehle können nur via M-x aufgerufen werden:\n" + +#: info/infodoc.c:228 +msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n" +msgstr "" +"--- »\\[history-node]« oder »\\[kill-node]« benutzen, um zu beenden ---\n" + +#: info/infodoc.c:483 +#, c-format +msgid "Describe key: %s" +msgstr "Beschreibe Taste: %s" + +#: info/infodoc.c:492 +#, c-format +msgid "ESC %s is undefined." +msgstr "ESC %s ist nicht definiert." + +#: info/infodoc.c:509 +#, c-format +msgid "%s is undefined." +msgstr "%s ist nicht definiert." + +#: info/infodoc.c:535 +#, fuzzy, c-format +msgid "%s is defined to %s." +msgstr "%s ist nicht definiert." + +#: info/infodoc.c:731 +msgid "Where is command: " +msgstr "Wo ist der Befehl: " + +#: info/infodoc.c:753 +#, c-format +msgid "`%s' is not on any keys" +msgstr "»%s« liegt auf keiner Taste" + +#: info/infodoc.c:759 +#, c-format +msgid "%s can only be invoked via %s." +msgstr "%s kann nur via %s aufgerufen werden." + +#: info/infodoc.c:762 +#, c-format +msgid "%s can be invoked via %s." +msgstr "%s kann via %s aufgerufen werden." + +#: info/infodoc.c:766 +#, c-format +msgid "There is no function named `%s'" +msgstr "Es gibt keine Funktion mit Namen »%s«" + +#: info/m-x.c:73 +msgid "Describe command: " +msgstr "Beschreibe den Befehl: " + +#: info/m-x.c:134 +msgid "Cannot execute an `echo-area' command here." +msgstr "Kann hier keinen »echo-area«-Befehl ausführen." + +# checkit +#: info/m-x.c:163 +#, c-format +msgid "Set screen height to (%d): " +msgstr "Bildschirm-Höhe auf (%d) setzen: " + +#: info/makedoc.c:126 +msgid "" +" Source files groveled to make this file include:\n" +"\n" +msgstr "" + +#: info/makedoc.c:450 +#, c-format +msgid "Couldn't manipulate the file %s.\n" +msgstr "Datei »%s« ist nicht zu verändern.\n" + +#: info/nodemenu.c:28 +msgid "" +"\n" +"* Menu:\n" +" (File)Node Lines Size Containing File\n" +" ---------- ----- ---- ---------------" +msgstr "" +"\n" +"* Menu:\n" +" (Datei)Node Zeilen Größe Beinhaltet Datei\n" +" ----------- ----- ---- ----------------" + +#: info/nodemenu.c:197 +msgid "" +"Here is the menu of nodes you have recently visited.\n" +"Select one from this menu, or use `\\[history-node]' in another window.\n" +msgstr "" + +#: info/nodemenu.c:309 +msgid "Select visited node: " +msgstr "" + +#: info/nodemenu.c:329 info/session.c:1996 +#, c-format +msgid "The reference disappeared! (%s)." +msgstr "" + +#: info/session.c:162 +#, c-format +msgid "" +"Welcome to Info version %s. \"\\[get-help-window]\" for help, " +"\"\\[menu-item]\" for menu item." +msgstr "" + +#: info/session.c:855 +msgid " times" +msgstr "" + +#: info/session.c:857 +#, c-format +msgid "%d times" +msgstr "" + +#: info/session.c:895 +msgid "No \"Next\" pointer for this node." +msgstr "" + +#: info/session.c:898 +msgid "Following \"Next\" node..." +msgstr "" + +#: info/session.c:899 info/session.c:927 info/session.c:999 +#: info/session.c:1717 +msgid "Next" +msgstr "" + +#: info/session.c:915 +msgid "Selecting first menu item..." +msgstr "Ersten Menupunkt auswählen..." + +#: info/session.c:926 +#, fuzzy +msgid "Selecting \"Next\" node..." +msgstr "Ersten Menupunkt auswählen..." + +#: info/session.c:950 info/session.c:1063 info/session.c:1733 +msgid "Up" +msgstr "" + +#: info/session.c:1020 +msgid "No more nodes." +msgstr "Keine \"Nodes\" mehr" + +#: info/session.c:1044 +msgid "No \"Prev\" for this node." +msgstr "" + +#. Move to the previous node. If this node now contains a menu, +#. and we have not inhibited movement to it, move to the node +#. corresponding to the last menu item. +#: info/session.c:1047 info/session.c:1100 +msgid "Moving \"Prev\" in this window." +msgstr "" + +#: info/session.c:1048 info/session.c:1101 info/session.c:1725 +msgid "Prev" +msgstr "" + +#: info/session.c:1059 +msgid "No \"Prev\" or \"Up\" for this node." +msgstr "" + +#: info/session.c:1062 +msgid "Moving \"Up\" in this window." +msgstr "" + +#: info/session.c:1110 +msgid "Moving to \"Prev\"'s last menu item." +msgstr "" + +#: info/session.c:1436 +msgid "Cannot delete a permanent window" +msgstr "" + +#: info/session.c:1750 info/session.c:1768 +msgid "This window has no additional nodes" +msgstr "" + +#: info/session.c:1813 +#, c-format +msgid "There aren't %d items in this menu." +msgstr "Es sind keine %d Punkte in diesem Menu." + +#: info/session.c:1944 +#, c-format +msgid "Menu item (%s): " +msgstr "Menupunkt (%s): " + +#: info/session.c:1946 +msgid "Menu item: " +msgstr "Menupunkt: " + +#: info/session.c:1951 +#, c-format +msgid "Follow xref (%s): " +msgstr "" + +#: info/session.c:1953 +msgid "Follow xref: " +msgstr "" + +#: info/session.c:2169 info/session.c:2173 +msgid "Goto Node: " +msgstr "" + +#: info/session.c:2198 +msgid "Get Manpage: " +msgstr "" + +#. Notice that the node "Top" is special, and doesn't have to +#. be referenced. +#: info/session.c:2230 makeinfo/makeinfo.c:5135 makeinfo/makeinfo.c:5218 +msgid "Top" +msgstr "Top" + +#: info/session.c:2254 +#, c-format +msgid "Kill node (%s): " +msgstr "" + +#: info/session.c:2307 +#, fuzzy, c-format +msgid "Cannot kill node `%s'" +msgstr "Kann »%s« nicht finden." + +#: info/session.c:2317 +msgid "Cannot kill the last node" +msgstr "" + +#: info/session.c:2419 +#, fuzzy +msgid "Find file: " +msgstr " Unterdatei: %s" + +#: info/session.c:2436 +#, c-format +msgid "Cannot find \"%s\"." +msgstr "Kann »%s« nicht finden." + +#: info/session.c:2483 info/session.c:2608 +#, fuzzy, c-format +msgid "Could not create output file \"%s\"." +msgstr "Datei »%s« ist nicht zu verändern.\n" + +#: info/session.c:2496 info/session.c:2625 info/session.c:2671 +msgid "Done." +msgstr "Fertig." + +#: info/session.c:2553 +#, c-format +msgid "Writing node \"(%s)%s\"..." +msgstr "" + +#: info/session.c:2556 +#, fuzzy, c-format +msgid "Writing node \"%s\"..." +msgstr "Index von »%s« wird durchsucht..." + +#: info/session.c:2654 +#, fuzzy, c-format +msgid "Cannot open pipe to \"%s\"." +msgstr "Kann »%s« nicht finden." + +#: info/session.c:2661 +#, fuzzy, c-format +msgid "Printing node \"(%s)%s\"..." +msgstr "Index von »%s« wird durchsucht..." + +#: info/session.c:2664 +#, fuzzy, c-format +msgid "Printing node \"%s\"..." +msgstr "Index von »%s« wird durchsucht..." + +#: info/session.c:2896 +#, fuzzy, c-format +msgid "Searching subfile \"%s\"..." +msgstr "Index von »%s« wird durchsucht..." + +#: info/session.c:2966 +#, c-format +msgid "%s for string [%s]: " +msgstr "" + +#: info/session.c:2967 +msgid "Search backward" +msgstr "" + +#: info/session.c:2967 +msgid "Search" +msgstr "" + +#: info/session.c:2994 +msgid "Search failed." +msgstr "" + +#: info/session.c:3120 +msgid "I-search backward: " +msgstr "" + +#: info/session.c:3122 +msgid "I-search: " +msgstr "" + +#: info/session.c:3147 +msgid "Failing " +msgstr "" + +#: info/session.c:3512 +#, fuzzy +msgid "No cross references in this node." +msgstr "Es gibt kein Menu in diesem Node." + +#: info/session.c:3627 +msgid "Quit" +msgstr "" + +#: info/session.c:3728 +#, fuzzy, c-format +msgid "Unknown command (%s)." +msgstr "Unbekannter Befehl (%s)." + +#: info/session.c:3733 +msgid "\"\" is invalid" +msgstr "\"\" ist ungültig" + +#: info/session.c:3735 +#, c-format +msgid "\"%s\" is invalid" +msgstr "\"%s\" ist ungültig" + +#: info/variables.c:40 +msgid "When \"On\", footnotes appear and disappear automatically" +msgstr "" + +#: info/variables.c:44 +msgid "When \"On\", creating or deleting a window resizes other windows" +msgstr "" + +#: info/variables.c:48 +msgid "When \"On\", flash the screen instead of ringing the bell" +msgstr "" + +#: info/variables.c:52 +msgid "When \"On\", errors cause the bell to ring" +msgstr "" + +#: info/variables.c:56 +msgid "When \"On\", Info garbage collects files which had to be uncompressed" +msgstr "" + +#: info/variables.c:59 +msgid "When \"On\", the portion of the matched search string is highlighted" +msgstr "" + +#: info/variables.c:63 +msgid "Controls what happens when scrolling is requested at the end of a node" +msgstr "" + +#: info/variables.c:67 +msgid "The number lines to scroll when the cursor moves out of the window" +msgstr "" + +#: info/variables.c:71 +msgid "When \"On\", Info accepts and displays ISO Latin characters" +msgstr "" + +#. Get the variable's name. +#: info/variables.c:83 +#, fuzzy +msgid "Describe variable: " +msgstr "Beschreibe Taste: %s" + +#. Get the variable's name and value. +#: info/variables.c:108 +msgid "Set variable: " +msgstr "" + +# checkit +#: info/variables.c:126 +#, fuzzy, c-format +msgid "Set %s to value (%d): " +msgstr "Bildschirm-Höhe auf (%d) setzen: " + +#: info/variables.c:167 +#, c-format +msgid "Set %s to value (%s): " +msgstr "" + +#: info/window.c:1102 +msgid "--*** Tags out of Date ***" +msgstr "" + +#. strlen (location_indicator). +#. 10 for the decimal representation of the number of lines in this +#. node, and the remainder of the text that can appear in the line. +#: info/window.c:1113 +msgid "-----Info: (), lines ----, " +msgstr "-----Info: (), Zeilen ----, " + +#: info/window.c:1120 +#, c-format +msgid "-%s---Info: %s, %d lines --%s--" +msgstr "-%s---Info: %s, %d Zeilen --%s--" + +#: info/window.c:1124 +#, c-format +msgid "-%s%s-Info: (%s)%s, %d lines --%s--" +msgstr "-%s%s-Info: (%s)%s, %d Zeilen --%s--" + +#: info/window.c:1131 +#, c-format +msgid " Subfile: %s" +msgstr " Unterdatei: %s" + +#: makeinfo/makeinfo.c:889 +#, fuzzy, c-format +msgid "%s:%d: warning: " +msgstr "%s:%d: Warnung: " + +#: makeinfo/makeinfo.c:912 +msgid "Too many errors! Gave up.\n" +msgstr "Zu viele Fehler! Abbruch.\n" + +#: makeinfo/makeinfo.c:971 makeinfo/makeinfo.c:996 makeinfo/makeinfo.c:1064 +#, fuzzy, c-format +msgid "%s: %s arg must be numeric, not `%s'.\n" +msgstr "%s: Argument für --error-limit muss numerisch sein, nicht »%s«.\n" + +#: makeinfo/makeinfo.c:985 +#, fuzzy, c-format +msgid "Couldn't open macro expansion output `%s'" +msgstr "" +"Für die Macro-Auflösung kann die Ausgabe nach »%s« nicht geöffnet werden" + +#: makeinfo/makeinfo.c:988 +msgid "Cannot specify more than one macro expansion output" +msgstr "Mehr als eine Ausgabedatei darf nicht angegeben werden" + +#: makeinfo/makeinfo.c:1032 +#, fuzzy, c-format +msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n" +msgstr "" +"%s: Argument für --paragraph-indent muss numerisch/»none«/»asis«, sein, " +"nicht »%s«.\n" + +#: makeinfo/makeinfo.c:1075 +#, c-format +msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n" +msgstr "" +"%s: Argument für --footnote-style muss »separate« oder »end« sein, nicht " +"»%s«.\n" + +# Hier de-Standard-Formulierung einsetzen! +#: makeinfo/makeinfo.c:1085 util/install-info.c:522 util/texindex.c:348 +msgid "" +"Copyright (C) 1996 Free Software Foundation, Inc.\n" +"There is NO warranty. You may redistribute this software\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the files named COPYING." +msgstr "" +"Copyright © %s Free Software Foundation, Inc.\n" +"Dies ist freie Software; in den Quellen befindet sich die Lizenz- und\n" +"Kopierbedingung. Es gibt KEINERLEI Garantie, nicht einmal für die\n" +"TAUGLICHKEIT oder die VERWENDBARKEIT ZU EINEM ANGEGEBENEN ZWECK." + +#: makeinfo/makeinfo.c:1105 +#, c-format +msgid "%s: missing file argument.\n" +msgstr "%s: Datei-Angabe fehlt.\n" + +#: makeinfo/makeinfo.c:1146 +#, fuzzy, c-format +msgid "makeinfo (GNU %s %s) %d.%d\n" +msgstr "GNU Makeinfo (Texinfo 3.9) %d.%d\n" + +# checkit +#: makeinfo/makeinfo.c:1158 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "»%s --help« gibt weitere Informationen.\n" + +# checkit +# Die "." am Zeilenende habe ich entfernt. -ke- +#: makeinfo/makeinfo.c:1160 +#, fuzzy, c-format +msgid "" +"Usage: %s [OPTION]... TEXINFO-FILE...\n" +"\n" +"Translate Texinfo source documentation to a format suitable for reading\n" +"with GNU Info.\n" +"\n" +"Options:\n" +"-D VAR define a variable, as with @set.\n" +"-E MACRO-OFILE process macros only, output texinfo source.\n" +"-I DIR append DIR to the @include directory search path.\n" +"-P DIR prepend DIR to the @include directory search path.\n" +"-U VAR undefine a variable, as with @clear.\n" +"--error-limit NUM quit after NUM errors (default %d).\n" +"--fill-column NUM break lines at NUM characters (default %d).\n" +"--footnote-style STYLE output footnotes according to STYLE:\n" +" `separate' to place footnotes in their own node,\n" +" `end' to place the footnotes at the end of\n" +" the node in which they are defined (the default).\n" +"--force preserve output even if errors.\n" +"--help display this help and exit.\n" +"--no-validate suppress node cross-reference validation.\n" +"--no-warn suppress warnings (but not errors).\n" +"--no-split suppress splitting of large files.\n" +"--no-headers suppress node separators and Node: Foo headers.\n" +"--output FILE, -o FILE output to FILE, and ignore any @setfilename.\n" +"--paragraph-indent VAL indent paragraphs with VAL spaces (default %d).\n" +" if VAL is `none', do not indent; if VAL is `asis',\n" +" preserve any existing indentation.\n" +"--reference-limit NUM complain about at most NUM references (default %d).\n" +"--verbose report about what is being done.\n" +"--version display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" +"Aufruf: %s [OPTION]... TEXINFO-DATEI...\n" +"\n" +"Texinfo-Quelltext in ein Format übersetzen, das mit GNU Info gelesen werden\n" +"kann.\n" +"\n" +"Optionen:\n" +"-D VAR eine Variable definieren, wie mit @set.\n" +"-E MACRO-AUSGABEDATEI nur die Macros auflösen, Texinfo-Quelltext ausgeben\n" +"-I VERZ VERZ in die Verzeichnis-Suchliste für @include " +"aufnehmen\n" +"-U VAR eine Variable aufheben, wie mit @clear\n" +"--error-limit ZAHL nach ZAHL Fehlern beenden (Standard %d)\n" +"--fill-column ZAHL Zeilen nach ZAHL Zeichen umbrechen (Standard %d)\n" +"--footnote-style STYLE Fußnoten gemäß STYLE ausgeben:\n" +" »separate«: Fußnoten in einen eigenen \"node\" " +"plazieren;\n" +" »end«: Fußnoten an das Ende des \"nodes\" " +"setzen, in\n" +" dem sie definiert sind (Standard)\n" +"--help diese Hilfe zeigen\n" +"--no-validate Überprüfen der \"node\"-Querverweise unterdrücken\n" +"--no-warn Warnungen unterdrücken (aber keine Fehler)\n" +"--no-split Aufteilen langer Dateien unterdrücken\n" +"--no-headers \"node\"-Unterteiler und \"Node\" unterdrücken: Foo " +"headers\n" +"--output DATEI, -o DATEI Ausgabe nach DATEI und @setfilename ignorieren\n" +"--paragraph-indent ZAHL/»none«/»asis«\n" +" Absätze mit ZAHL Leerräumen einziehen (Standard %d);\n" +" »none«: keine Leerräume\n" +" »asis«: keine Veränderung hinsichtlich der Leerräume\n" +"--reference-limit ZAHL bei wenigstens ZAHL Verweise melden (Standard %d)\n" +"--verbose ausführlich die Bearbeitungschritte anzeigen\n" +"--version Programmversion anzeigen\n" +"\n" +"Fehlerberichte (\"bugs\") bitte an <bug-texinfo@prep.ai.mit.edu> schicken.\n" + +#: makeinfo/makeinfo.c:1545 +#, c-format +msgid "%s: getwd: %s, %s\n" +msgstr "" + +#: makeinfo/makeinfo.c:1741 +#, c-format +msgid "Expected `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2072 +#, fuzzy, c-format +msgid "No `%s' found in `%s'" +msgstr "%s; für Datei »%s«.\n" + +#: makeinfo/makeinfo.c:2122 +#, c-format +msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2141 +#, c-format +msgid "Making %s file `%s' from `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2171 +#, c-format +msgid "This is Info file %s, produced by Makeinfo version %d.%d" +msgstr "" + +#: makeinfo/makeinfo.c:2173 +#, c-format +msgid " from the input file %s.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2192 +#, c-format +msgid "" +"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. If there were errors, and no --force, remove the output. +#: makeinfo/makeinfo.c:2224 +#, c-format +msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. Special case. I'm not supposed to see this character by itself. +#. If I do, it means there is a syntax error in the input text. +#. Report the error here, but remember this brace on the stack so +#. you can ignore its partner. +#: makeinfo/makeinfo.c:2364 makeinfo/makeinfo.c:7624 +#, fuzzy, c-format +msgid "Misplaced %c" +msgstr "Fehlplazierte »}«" + +#: makeinfo/makeinfo.c:2451 +#, fuzzy, c-format +msgid "Unknown command `%s'" +msgstr "Unbekannter Befehl (%s)." + +#: makeinfo/makeinfo.c:2471 +msgid "NO_NAME!" +msgstr "" + +#: makeinfo/makeinfo.c:2485 +#, c-format +msgid "%c%s expected `{...}'" +msgstr "" + +#: makeinfo/makeinfo.c:2518 +#, fuzzy +msgid "Unmatched }" +msgstr "Nicht übereinstimmende »%c%s«" + +#: makeinfo/makeinfo.c:2566 +#, fuzzy, c-format +msgid "%c%s missing close brace" +msgstr "%s: Datei-Angabe fehlt.\n" + +#: makeinfo/makeinfo.c:3362 +msgid "Broken-Type in insertion_type_pname" +msgstr "" + +#: makeinfo/makeinfo.c:3428 +msgid "Enumeration stack overflow" +msgstr "" + +#: makeinfo/makeinfo.c:3460 +#, c-format +msgid "lettering overflow, restarting at %c" +msgstr "" + +#: makeinfo/makeinfo.c:3499 +#, fuzzy +msgid "* Menu:\n" +msgstr "Menu" + +#: makeinfo/makeinfo.c:3583 +#, fuzzy, c-format +msgid "%s requires an argument: the formatter for %citem" +msgstr "%s erfordert einen Buchstaben oder eine Zahl" + +#: makeinfo/makeinfo.c:3687 +#, c-format +msgid "`%cend' expected `%s', but saw `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:3800 +#, fuzzy, c-format +msgid "No matching `%cend %s'" +msgstr "Nicht übereinstimmende »%c%s«" + +#: makeinfo/makeinfo.c:3939 +#, c-format +msgid "How did @%s end up in cm_special_char?\n" +msgstr "" + +#. This error message isn't perfect if the argument is multiple +#. characters, but it doesn't seem worth getting right. +#: makeinfo/makeinfo.c:3953 +#, c-format +msgid "%c%s expects `i' or `j' as argument, not `%c'" +msgstr "" + +#: makeinfo/makeinfo.c:3957 +#, c-format +msgid "%c%s expects a single character `i' or `j' as argument" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "January" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "February" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "March" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "April" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "May" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "June" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "July" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "August" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "September" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "October" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "November" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "December" +msgstr "" + +#: makeinfo/makeinfo.c:3976 +#, c-format +msgid "%d %s %d" +msgstr "" + +#: makeinfo/makeinfo.c:4029 +#, c-format +msgid "%c%s expects a single character as an argument" +msgstr "" + +#: makeinfo/makeinfo.c:4143 +#, c-format +msgid "%c%s is obsolete" +msgstr "" + +#: makeinfo/makeinfo.c:4315 +#, c-format +msgid "There already is a node having %ctop as a section" +msgstr "" + +#: makeinfo/makeinfo.c:4327 +#, c-format +msgid "Here is the %ctop node" +msgstr "" + +#: makeinfo/makeinfo.c:4346 +#, c-format +msgid "%ctop used before %cnode, defaulting to %s" +msgstr "" + +#: makeinfo/makeinfo.c:4421 +#, c-format +msgid "%c%s is obsolete; use %c%s instead" +msgstr "" + +#: makeinfo/makeinfo.c:4670 +#, fuzzy, c-format +msgid "Node `%s' multiply defined (line %d is first definition at)" +msgstr "\"Node\" »%s« mehrfach definiert (%d ist erste Definition)" + +#: makeinfo/makeinfo.c:4743 +#, c-format +msgid "Formatting node %s...\n" +msgstr "" + +#: makeinfo/makeinfo.c:4792 +#, c-format +msgid "Node `%s' requires a sectioning command (e.g. %c%s)" +msgstr "\"Node\" »s« erfordert eine Unterteilungs-Angabe, z.B. »%c%s«" + +#: makeinfo/makeinfo.c:5075 +#, c-format +msgid "Node `%s''s Next field not pointed back to" +msgstr "\"Next field\" des \"Nodes\" »%s« verweist nicht zurück nach" + +# checkit +#: makeinfo/makeinfo.c:5080 +#, c-format +msgid "This node (`%s') is the one with the bad `Prev'" +msgstr "Dieser \"node\" (»%s«) hat schlechten(?) \"Prev\"-Eintrag" + +#: makeinfo/makeinfo.c:5120 +#, fuzzy, c-format +msgid "Node `%s's Prev field not pointed back to" +msgstr "Das \"Prev field\" des \"nodes\" »%s« verweist nicht zurück nach" + +# checkit +#: makeinfo/makeinfo.c:5124 +#, fuzzy, c-format +msgid "This node (`%s') has the bad Next" +msgstr "Dieser \"node\" (»%s«) hat schlechten(?) \"Next\"-Eintrag" + +#: makeinfo/makeinfo.c:5136 +#, fuzzy, c-format +msgid "Node `%s' missing Up field" +msgstr "Dem \"node\" »%s« fehlt ein \"Up field\"" + +#: makeinfo/makeinfo.c:5176 +#, c-format +msgid "`%s' has an Up field of `%s', but `%s' has no menu item for `%s'" +msgstr "" +"»%s« hat ein \"Up field\" von »%s«, aber »%s« hat keinen Menu-Eintrag für " +"»%s«" + +#: makeinfo/makeinfo.c:5207 +#, fuzzy, c-format +msgid "node `%s' has been referenced %d times" +msgstr "Auf \"node\" »%s« wird %d mal verwiesen" + +# checkit +#: makeinfo/makeinfo.c:5219 +#, fuzzy, c-format +msgid "unreferenced node `%s'" +msgstr "Auf \"node\" »%s« wird nicht verwiesen" + +# checkit +#: makeinfo/makeinfo.c:5246 +#, fuzzy, c-format +msgid "%s reference to nonexistent node `%s'" +msgstr "Auf \"node\" »%s« wird nicht verwiesen" + +# checkit +#: makeinfo/makeinfo.c:5658 makeinfo/makeinfo.c:5670 +#, fuzzy, c-format +msgid "%cmenu seen before first node" +msgstr "%cmenu festgestellt, bevor ein \"node\" definiert wurde." + +# checkit +#: makeinfo/makeinfo.c:5659 makeinfo/makeinfo.c:5671 +#, fuzzy +msgid "creating `Top' node" +msgstr "»TOP«-\"node\" wird angelegt." + +#: makeinfo/makeinfo.c:5784 +#, c-format +msgid "`.' or `,' must follow cross reference, not %c" +msgstr "" + +#: makeinfo/makeinfo.c:5952 +#, c-format +msgid "@image file `%s' unreadable: %s" +msgstr "" + +#: makeinfo/makeinfo.c:5956 +#, fuzzy +msgid "@image missing filename argument" +msgstr "%s: Datei-Angabe fehlt.\n" + +#: makeinfo/makeinfo.c:6057 +#, fuzzy, c-format +msgid "%s requires letter or digit" +msgstr "%s erfordert einen Buchstaben oder eine Zahl" + +#: makeinfo/makeinfo.c:6142 +#, c-format +msgid "Unmatched `%c%s'" +msgstr "Nicht übereinstimmende »%c%s«" + +#: makeinfo/makeinfo.c:6149 +#, c-format +msgid "`%c%s' needs something after it" +msgstr "»%c%s« braucht etwas Nachfolgendes" + +# checkit +#: makeinfo/makeinfo.c:6155 +#, c-format +msgid "Bad argument to `%s', `%s', using `%s'" +msgstr "Falsches Argument für »%s«, »%s«, wenn »%s« benutzt wird" + +#: makeinfo/makeinfo.c:6328 +#, c-format +msgid "{No Value For \"%s\"}" +msgstr "" + +#: makeinfo/makeinfo.c:6378 +#, c-format +msgid "%c%s requires a name" +msgstr "%c%s erfordert einen Namen" + +#: makeinfo/makeinfo.c:6486 +#, c-format +msgid "Reached eof before matching @end %s" +msgstr "" + +#: makeinfo/makeinfo.c:6715 +#, c-format +msgid "The `%c%s' command is meaningless within a `@%s' block" +msgstr "Der »%c%s«-Befehl ist sinnlos innerhalb eines »@%s«-Blocks" + +#: makeinfo/makeinfo.c:6724 +#, c-format +msgid "%citemx is not meaningful inside of a `%s' block" +msgstr "%citemx ist nicht sinnvoll innerhalb eines »@%s«-Blocks" + +# checkit +#: makeinfo/makeinfo.c:6837 +#, c-format +msgid "%c%s found outside of an insertion block" +msgstr "%c%s außerhalb eines Einfügungsblocks gefunden" + +# checkit +#: makeinfo/makeinfo.c:6928 +#, c-format +msgid "Missing `}' in %cdef arg" +msgstr "Fehlende »}« in »%cdef«-Argument" + +#: makeinfo/makeinfo.c:7137 makeinfo/makeinfo.c:7157 +msgid "Function" +msgstr "" + +#: makeinfo/makeinfo.c:7141 +msgid "Macro" +msgstr "" + +#: makeinfo/makeinfo.c:7145 +msgid "Special Form" +msgstr "" + +#: makeinfo/makeinfo.c:7149 makeinfo/makeinfo.c:7161 +msgid "Variable" +msgstr "" + +#: makeinfo/makeinfo.c:7153 +#, fuzzy +msgid "User Option" +msgstr "Vervollständigung einfügen" + +#: makeinfo/makeinfo.c:7165 +#, fuzzy +msgid "Instance Variable" +msgstr "Beschreibe Taste: %s" + +#: makeinfo/makeinfo.c:7169 makeinfo/makeinfo.c:7173 +msgid "Method" +msgstr "" + +# checkit +#: makeinfo/makeinfo.c:7330 +#, c-format +msgid "Must be in a `%s' insertion in order to use `%s'x" +msgstr "Muss in einer »%s«-Einfügung sein, wenn »%s«x benutzt werden soll" + +# checkit +#: makeinfo/makeinfo.c:7402 +#, c-format +msgid "%csp requires a positive numeric argument" +msgstr "»%csp« erfordert ein positives numerisches Argument" + +#: makeinfo/makeinfo.c:7645 +#, fuzzy +msgid "asis" +msgstr "ist" + +# checkit +#: makeinfo/makeinfo.c:7647 +#, fuzzy +msgid "none" +msgstr "(keine)" + +#: makeinfo/makeinfo.c:7669 +#, c-format +msgid "Bad argument to %c%s" +msgstr "Falsches Argument für »%c%s«" + +#: makeinfo/makeinfo.c:7961 +#, fuzzy, c-format +msgid "Unknown index `%s'" +msgstr "Unbekannter Index-Name »%s«" + +#: makeinfo/makeinfo.c:8026 +#, c-format +msgid "Index `%s' already exists" +msgstr "Index »%s« ist schon vorhanden" + +#: makeinfo/makeinfo.c:8057 +#, fuzzy, c-format +msgid "Unknown index `%s' and/or `%s' in @synindex" +msgstr "Unbekannter Index-Name »%s«" + +#: makeinfo/makeinfo.c:8246 +#, fuzzy, c-format +msgid "Unknown index `%s' in @printindex" +msgstr "Unbekannter Index-Name »%s«" + +#: makeinfo/makeinfo.c:8261 +#, fuzzy +msgid "" +"* Menu:\n" +"\n" +msgstr "Menu" + +#: makeinfo/makeinfo.c:8448 +#, c-format +msgid "`%c%s' needs an argument `{...}', not just `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8463 +#, c-format +msgid "No closing brace for footnote `%s'" +msgstr "Keine schließende Klammer für Fußnote »%s«" + +# checkit +#: makeinfo/makeinfo.c:8502 +msgid "Footnote defined without parent node" +msgstr "Fußnote definiert ohne einen Eltern-\"node\"" + +#: makeinfo/makeinfo.c:8534 +#, fuzzy +msgid "-Footnotes" +msgstr "*Fußnoten*" + +#: makeinfo/makeinfo.c:8589 +#, fuzzy +msgid "" +"---------- Footnotes ----------\n" +"\n" +msgstr "" +"---------------------\n" +"\n" + +#: makeinfo/makeinfo.c:8685 +#, fuzzy, c-format +msgid "macro `%s' previously defined" +msgstr "Macro »%s« ist bereits definiert" + +#: makeinfo/makeinfo.c:8689 +#, fuzzy, c-format +msgid "here is the previous definition of `%s'" +msgstr "Hier ist die vorangehende Definition von »%s«" + +#: makeinfo/makeinfo.c:8903 +#, c-format +msgid "Macro `%s' called with too many args" +msgstr "Macro »%s« mit zu vielen Argumenten aufgerufen" + +#: makeinfo/makeinfo.c:9055 +#, c-format +msgid "%cend macro not found" +msgstr "»%cend«-Macro nicht gefunden" + +# checkit +#: makeinfo/makeinfo.c:9095 +#, c-format +msgid "%cquote-arg only useful when the macro takes a single argument" +msgstr "" +"»%cquote«-Argument ist nur sinnvoll, wenn das Macro ein einziges Argument hat" + +#: makeinfo/multi.c:206 +#, c-format +msgid "ignoring stray text `%s' after @multitable" +msgstr "irriger Text »%s« nach @multitable wird ignoriert" + +#: makeinfo/multi.c:277 +#, c-format +msgid "Too many columns in multitable item (max %d)" +msgstr "zu viele Spalten im \"multitable\"-Eintrag (maximal %d)" + +# checkit +#. impossible, I think. +#: makeinfo/multi.c:304 +msgid "multitable item not in active multitable" +msgstr "\"multitable\"-Eintrag nicht in der aktiven \"multitable\"" + +#: makeinfo/multi.c:313 +#, c-format +msgid "Cannot select column #%d in multitable" +msgstr "Spalte #%d kann in der \"multitable\" nicht ausgewählt werden" + +#: makeinfo/multi.c:404 +msgid "ignoring @tab outside of multitable" +msgstr "@tab außerhalb der \"multitable\" wird übergangen" + +# checkit +#: makeinfo/multi.c:428 +msgid "** Multicolumn output from last row:\n" +msgstr "** Mehrspalten-Ausgabe von der letzten Zeile:\n" + +# checkit +#: makeinfo/multi.c:431 +#, c-format +msgid "* column #%d: output = %s\n" +msgstr "* Spalte #%d: Ausgabe = %s\n" + +# checkit +#: util/install-info.c:119 util/install-info.c:132 +msgid "virtual memory exhausted" +msgstr "virtual memory exhausted" + +#: util/install-info.c:188 +#, fuzzy, c-format +msgid "%s: warning: " +msgstr "%s: Warnung: " + +#: util/install-info.c:209 +#, c-format +msgid " for %s" +msgstr " für %s" + +#: util/install-info.c:278 +#, fuzzy, c-format +msgid "\tTry `%s --help' for a complete list of options.\n" +msgstr "»%s --help« gibt weitere Informationen.\n" + +# checkit +#: util/install-info.c:286 +#, fuzzy, c-format +msgid "" +"%s [OPTION]... [INFO-FILE [DIR-FILE]]\n" +" Install INFO-FILE in the Info directory file DIR-FILE.\n" +"\n" +"Options:\n" +"--delete Delete existing entries in INFO-FILE;\n" +" don't insert any new entries.\n" +"--dir-file=NAME Specify file name of Info directory file.\n" +" This is equivalent to using the DIR-FILE argument.\n" +"--entry=TEXT Insert TEXT as an Info directory entry.\n" +" TEXT should have the form of an Info menu item line\n" +" plus zero or more extra lines starting with whitespace.\n" +" If you specify more than one entry, they are all added.\n" +" If you don't specify any entries, they are determined\n" +" from information in the Info file itself.\n" +"--help Display this help and exit.\n" +"--info-file=FILE Specify Info file to install in the directory.\n" +" This is equivalent to using the INFO-FILE argument.\n" +"--info-dir=DIR Same as --dir-file=DIR/dir.\n" +"--item=TEXT Same as --entry TEXT.\n" +" An Info directory entry is actually a menu item.\n" +"--quiet Suppress warnings.\n" +"--remove Same as --delete.\n" +"--section=SEC Put this file's entries in section SEC of the directory.\n" +" If you specify more than one section, all the entries\n" +" are added in each of the sections.\n" +" If you don't specify any sections, they are determined\n" +" from information in the Info file itself.\n" +"--version Display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" +"%s [OPTION]... [INFO-DATEI [VERZ-DATEI]]\n" +" Installiere die INFO-DATEI in dem Info-Verzeichnis VERZ-DATEI.\n" +"\n" +"Optionen:\n" +"--delete entferne vorhandene Einträge aus INFO-DATEI; keine neuen\n" +" Einträge einfügen\n" +"--dir-file=NAME Namen der Info-Verzeichnis-Datei angeben. " +"Gleichbedeutend\n" +" mit dem VERZ-DATEI-Argument\n" +"--entry=TEXT TEXT als einen Info-Verzeichnis-Eintrag einfügen. TEXT " +"soll\n" +" die Form einer Zeile eines Info-Menupunkts haben,\n" +" zuzüglich null oder mehrerer Extra-Zeilen, die mit " +"Leerraum\n" +" (\"whitespace\") beginnen. Wenn mehr als ein Eintrag " +"angegeben\n" +" wird, werden alle hinzugefügt. Wenn gar kein Eintrag " +"angege-\n" +" ben wird, wird der Eintragstext der Info-Datei selbst " +"ent-\n" +" nommen.\n" +"--help diese Hilfe zeigen\n" +"--info-file=DATEI Info-Datei angeben, die im Verzeichnis zu installieren " +"ist.\n" +" Gleichbedeutend mit dem INFO-DATEI-Argument\n" +"--info-dir=VERZ wie --dir-file=VERZ/dir.\n" +"--item=TEXT wie --entry TEXT. Ein Info-Verzeichnis-Eintrag ist " +"nämlich\n" +" ein Menupunkt\n" +"--quiet Warnungen unterdrücken\n" +"--remove wie --delete\n" +"--section=ABSCHNITT stelle die Einträge dieser Datei in den Abschnitt " +"ABSCHNITT\n" +" des Verzeichnisses. Wenn mehr als ein --section " +"angegeben\n" +" wird, werden alle Einträge in jedem der Abschnitte\n" +" hinzugefügt. Wenn gar kein --section angegeben wird, " +"wird\n" +" der Eintragstext der Info-Datei selbst entnommen.\n" +"--version Programmversion anzeigen\n" +"\n" +"Fehlerberichte (\"bugs\") bitte an <bug-texinfo@prep.ai.mit.edu> schicken.\n" + +#: util/install-info.c:334 +msgid "" +"This is the file .../info/dir, which contains the\n" +"topmost node of the Info hierarchy, called (dir)Top.\n" +"The first time you invoke Info you start off looking at this node.\n" +"\n" +"File: dir Node: Top This is the top of the INFO tree\n" +"\n" +" This (the Directory node) gives a menu of major topics.\n" +" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n" +" \"h\" gives a primer for first-timers,\n" +" \"mEmacs<Return>\" visits the Emacs manual, etc.\n" +"\n" +" In Emacs, you can click mouse button 2 on a menu item or cross reference\n" +" to select it.\n" +"\n" +"* Menu:\n" +msgstr "" + +#: util/install-info.c:357 +#, c-format +msgid "%s: could not read (%s) and could not create (%s)\n" +msgstr "" + +#: util/install-info.c:456 util/install-info.c:466 +#, c-format +msgid "%s: Specify the Info directory only once.\n" +msgstr "%s: Info-Verzeichnis nur einmal angeben.\n" + +#: util/install-info.c:494 +#, c-format +msgid "%s: Specify the Info file only once.\n" +msgstr "%s: Info-Datei nur einmal angeben.\n" + +#: util/install-info.c:521 +#, c-format +msgid "install-info (GNU %s) %s\n" +msgstr "" + +# checkit +#: util/install-info.c:541 +#, c-format +msgid "excess command line argument `%s'" +msgstr "Kommandozeilen-Argument »%s« wird übergangen" + +# checkit +#: util/install-info.c:545 +#, fuzzy +msgid "No input file specified; try --help for more information." +msgstr "»%s --help« gibt weitere Informationen.\n" + +# checkit +#: util/install-info.c:547 +#, fuzzy +msgid "No dir file specified; try --help for more information." +msgstr "»%s --help« gibt weitere Informationen.\n" + +#: util/install-info.c:599 util/install-info.c:622 +msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY" +msgstr "START-INFO-DIR-ENTRY ohne END-INFO-DIR-ENTRY" + +#: util/install-info.c:618 +msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY" +msgstr "END-INFO-DIR-ENTRY ohne START-INFO-DIR-ENTRY" + +#. No need to abort here, the original info file may not have +#. the requisite Texinfo commands. This is not something an +#. installer should have to correct (it's a problem for the +#. maintainer), and there's no need to cause subsequent parts of +#. `make install' to fail. +#: util/install-info.c:632 +#, fuzzy, c-format +msgid "no info dir entry in `%s'" +msgstr "Kein Info-Verzeichnis-Eintrag in »%s«" + +#: util/install-info.c:843 +#, c-format +msgid "menu item `%s' already exists, for file `%s'" +msgstr "Menupunkt »%s« bereits vorhanden, für Datei »%s«" + +#: util/install-info.c:866 +#, c-format +msgid "no entries found for `%s'; nothing deleted" +msgstr "keine Einträge für »%s« gefunden; nichts entfernt" + +#: util/texindex.c:263 +msgid "keep temporary files around after processing" +msgstr "temporäre Dateien bis nach der Verarbeitung aufheben" + +#: util/texindex.c:265 +msgid "do not keep temporary files around after processing (default)" +msgstr "keine temporäre Dateien bis nach der Verarbeitung aufheben (Standard)" + +#: util/texindex.c:267 +msgid "send output to FILE" +msgstr "Ausgabe nach DATEI schicken" + +#: util/texindex.c:269 +msgid "display version information and exit" +msgstr "Programmversion anzeigen" + +#: util/texindex.c:271 +msgid "display this help and exit" +msgstr "diese Hilfe anzeigen" + +#: util/texindex.c:282 +#, c-format +msgid "Usage: %s [OPTION]... FILE...\n" +msgstr "Aufruf: %s [OPTION]... DATEI...\n" + +#: util/texindex.c:283 +msgid "Generate a sorted index for each TeX output FILE.\n" +msgstr "Erzeuge einen sortierten Index für jede TeX-Ausgabedatei.\n" + +#. Avoid trigraph nonsense. +#: util/texindex.c:285 +msgid "Usually FILE... is `foo.??' for a document `foo.texi'.\n" +msgstr "DATEI... ist normalerweise »foo.??« für ein Dokument »foo.texi«.\n" + +#: util/texindex.c:286 +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Optionen:\n" + +#: util/texindex.c:300 +msgid "" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" +"\n" +"Fehler (\"bugs\") bitte an <bug-texinfo@prep.ai.mit.edu> melden." + +#: util/texindex.c:347 +#, fuzzy, c-format +msgid "texindex (GNU %s %s) 2.1\n" +msgstr "GNU Makeinfo (Texinfo 3.9) %d.%d\n" + +#: util/texindex.c:926 util/texindex.c:960 util/texindex.c:1036 +#: util/texindex.c:1064 +#, c-format +msgid "%s: not a texinfo index file" +msgstr "%s: keine Texinfo-Indexdatei" + +#: util/texindex.c:1021 +#, c-format +msgid "failure reopening %s" +msgstr "Fehler beim Wiederöffnen von »%s«" + +# checkit +#: util/texindex.c:1334 +#, c-format +msgid "entry %s follows an entry with a secondary name" +msgstr "Eintrag »%s« folgt einem Eintrag mit einem Zweitnamen" + +#: util/texindex.c:1672 +#, fuzzy, c-format +msgid "%s; for file `%s'.\n" +msgstr "%s; für Datei »%s«.\n" + +# checkit +#: util/texindex.c:1733 +#, c-format +msgid "Virtual memory exhausted in %s ()! Needed %d bytes." +msgstr "Virtual memory exhausted in %s ()! Needed %d bytes." + +#~ msgid "%s: --fill-column arg must be numeric, not `%s'.\n" +#~ msgstr "%s: Argument für --fill-column muss numerisch sein, nicht »%s«.\n" + +#~ msgid "%s: --reference-limit arg must be numeric, not `%s'.\n" +#~ msgstr "" +#~ "%s: Argument für --reference-limit muss numerisch sein, nicht »%s«.\n" + +#~ msgid "Misplaced `}'" +#~ msgstr "Fehlplazierte »}«" + +#~ msgid "No input file specified" +#~ msgstr "Keine Eingabedatei angegeben" + +#~ msgid "No dir file specified" +#~ msgstr "Keine »dir«-Datei angegeben" + +#, fuzzy +#~ msgid "No earlier nodes in this window." +#~ msgstr "Es gibt kein Menu in diesem Node." + +#~ msgid "Cross-reference must be terminated with a period or a comma" +#~ msgstr "Querverweis muss mit einem Punkt oder Komma beendet werden." + +#~ msgid "stdin" +#~ msgstr "Standard-Eingabe" + +#~ msgid "noname.texi" +#~ msgstr "noname.texi" + +#~ msgid "No node name specified for `%c%s' command" +#~ msgstr "Keinen \"node\"-Namen für »%c%s«-Befehl angegeben" + +#~ msgid "" +#~ "Validation error. `%s' field points to node `%s', which doesn't exist" +#~ msgstr "" +#~ "Fehler beim Überprüfen. Feld »%s« verweist auf \"node\" »%s«, den es nicht " +#~ "gibt." + +# checkit +#~ msgid "Unknown file system error" +#~ msgstr "Unbekannt file system Fehler" + +#~ msgid "Unknown index reference `%s'" +#~ msgstr "Unbekannter Index-Verweis »%s«" + +#~ msgid "Unknown index reference" +#~ msgstr "Unbekannter Index-Verweis" + +#~ msgid "`%c%s' expected more than just `%s'. It needs something in `{...}'" +#~ msgstr "»%c%s« erwartet mehr als nur »%s«. Es verlangt etwas in »{...}«" + +#~ msgid "%s: can not open: %s\n" +#~ msgstr "%s: kann nicht geöffnet werden: %s\n" + +#~ msgid "%s: %s: %d: mismatched braces\n" +#~ msgstr "%s: %s: %d: nicht übereinstimmende Klammern\n" + +#~ msgid "unknown error %d" +#~ msgstr "unbekannter Fehler %d" + +#~ msgid "Unknown error" +#~ msgstr "Unbekannter Fehler" + +#~ msgid "--version" +#~ msgstr "--version" + +#~ msgid "--keep" +#~ msgstr "--keep" + +#~ msgid "-k" +#~ msgstr "-k" + +#~ msgid "--help" +#~ msgstr "--help" + +#~ msgid "-h" +#~ msgstr "-h" + +#~ msgid "--output" +#~ msgstr "--output" + +#~ msgid "-o" +#~ msgstr "-o" + +#~ msgid "Index" +#~ msgstr "Index" + +#~ msgid "GNU Info (Texinfo 3.9) %s\n" +#~ msgstr "GNU Info (Texinfo 3.9) %s\n" + +#~ msgid "The current search path is:\n" +#~ msgstr "Der aktuelle Suchpfad ist:\n" + +#~ msgid "" +#~ "Commands available in the echo area:\n" +#~ "\n" +#~ msgstr "Verfügbare Befehle im Echo-Bereich:\n" + +# darf derzeit nicht übersetzt werden! -ke- +#~ msgid "Help" +#~ msgstr "Help" + +# darf derzeit nicht übersetzt werden! -ke- +#~ msgid "Help-Small-Screen" +#~ msgstr "Help-Small-Screen" + +#~ msgid "Info" +#~ msgstr "Info" + +#~ msgid "ESC " +#~ msgstr "ESC " + +#~ msgid "%s (%s): %s." +#~ msgstr "%s (%s): %s." + +#~ msgid "ESC %s" +#~ msgstr "ESC %s" + +#~ msgid "LFD" +#~ msgstr "LFD" + +#~ msgid "TAB" +#~ msgstr "TAB" + +#~ msgid "RET" +#~ msgstr "RET" + +#~ msgid "ESC" +#~ msgstr "ESC" + +#~ msgid "SPC" +#~ msgstr "SPC" + +#~ msgid "DEL" +#~ msgstr "DEL" + +# nicht üs -ke- +#~ msgid "echo-area-" +#~ msgstr "echo-area-" + +#~ msgid "/* %s -- Generated declarations for Info commands. */\n" +#~ msgstr "/* %s -- Erzeugte Deklarationen für Info-Befehle. */\n" + +# checkit +#~ msgid "done" +#~ msgstr "fertig" + +# checkit +#~ msgid "%s: Out of virtual memory!\n" +#~ msgstr "%s: Hauptspeicher erschöpft!\n" + +#~ msgid "Multitables cannot be nested" +#~ msgstr "\"Multitables\" können nicht verschachtelt sein" + +#~ msgid "--no-keep" +#~ msgstr "--no-keep" + +#~ msgid "*Apropos*" +#~ msgstr "*Apropos*" + +# checkit +#~ msgid "******************************" +#~ msgstr "******************************" diff --git a/gnu/usr.bin/texinfo/po/fr.gmo b/gnu/usr.bin/texinfo/po/fr.gmo Binary files differnew file mode 100644 index 00000000000..1b6caa1658f --- /dev/null +++ b/gnu/usr.bin/texinfo/po/fr.gmo diff --git a/gnu/usr.bin/texinfo/po/fr.po b/gnu/usr.bin/texinfo/po/fr.po new file mode 100644 index 00000000000..adb60a772f2 --- /dev/null +++ b/gnu/usr.bin/texinfo/po/fr.po @@ -0,0 +1,2445 @@ +# Version française du progiciel Texinfo-3.9 +# Copyright (C) 1996 Free Software Foundation, Inc. +# Laurent Bourbeau <bourbeau@progiciels-bpi.ca>, 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: texinfo 3.9POT-Creation-Date: 1997-07-13 " +"17:12-0400PO-Revision-Date: 1997-03-11 00:47 ESTLast-Translator: Laurent " +"Bourbeau <bourbeau@progiciels-bpi.ca>Language-Team: French " +"<fr@li.org>MIME-Version: 1.0Content-Type: text/plain; " +"charset=ISO-8859-1Content-Transfer-Encoding: 8-bitPOT-Creation-Date: " +"1997-07-13 17:12-0400POT-Creation-Date: 1997-07-13 " +"17:12-0400POT-Creation-Date: 1997-07-13 17:12-0400POT-Creation-Date: " +"1997-07-15 14:50-0400POT-Creation-Date: 1997-07-15 " +"14:50-0400POT-Creation-Date: 1997-07-15 15:35-0400POT-Creation-Date: " +"1997-07-15 15:35-0400POT-Creation-Date: 1997-07-17 " +"17:50-0400POT-Creation-Date: 1997-07-18 10:40-0400POT-Creation-Date: " +"1997-07-19 17:19-0400POT-Creation-Date: 1997-07-20 " +"08:19-0400POT-Creation-Date: 1997-07-20 08:19-0400POT-Creation-Date: " +"1997-07-20 08:19-0400POT-Creation-Date: 1997-07-25 " +"17:57-0400POT-Creation-Date: 1997-07-25 17:57-0400 POT-Creation-Date: " +"1997-07-29 18:04-0400POT-Creation-Date: 1997-07-31 " +"17:43-0400gPOT-Creation-Date: 1997-07-31 17:43-0400\n" +"m" + +#. Commands found in "./session.c". +#: info/doc.c:27 info/session.c:629 +msgid "Move down to the next line" +msgstr "Descendre à la ligne suivante" + +#. Move WINDOW's point up to the previous line if possible. +#: info/doc.c:28 info/session.c:644 +msgid "Move up to the previous line" +msgstr "Monter à la ligne précédente" + +#. Move WINDOW's point to the end of the true line. +#: info/doc.c:29 info/session.c:659 +msgid "Move to the end of the line" +msgstr "Aller à la fin de la ligne" + +#. Move WINDOW's point to the beginning of the true line. +#: info/doc.c:30 info/session.c:679 +msgid "Move to the start of the line" +msgstr "Aller au début de la ligne" + +#. Commands found in "./echo-area.c". +#: info/doc.c:31 info/doc.c:84 info/echo-area.c:283 info/session.c:698 +msgid "Move forward a character" +msgstr "Avancer d'un caractère" + +#. Move point backward in the node. +#: info/doc.c:32 info/doc.c:85 info/echo-area.c:295 info/session.c:714 +msgid "Move backward a character" +msgstr "Reculer d'un caractère" + +#. Move forward a word in the input line. +#: info/doc.c:33 info/doc.c:88 info/echo-area.c:320 info/session.c:732 +msgid "Move forward a word" +msgstr "Avancer d'un mot" + +#: info/doc.c:34 info/doc.c:89 info/echo-area.c:360 info/session.c:781 +msgid "Move backward a word" +msgstr "Reculer d'un mot" + +#: info/doc.c:35 info/session.c:1121 +msgid "Move forwards or down through node structure" +msgstr "Avancer ou descendre à travers la structure de noeuds" + +#: info/doc.c:36 info/session.c:1137 +#, fuzzy +msgid "Move backwards or up through node structure" +msgstr "Avancer ou descendre à travers la structure de noeuds" + +#. Show the next screen of WINDOW's node. +#: info/doc.c:37 info/session.c:1152 +msgid "Scroll forward in this window" +msgstr "Défiler vers l'avant dans cette fenêtre" + +#. Show the previous screen of WINDOW's node. +#: info/doc.c:38 info/session.c:1197 +msgid "Scroll backward in this window" +msgstr "Défiler vers l'arrière dans cette fenêtre" + +#. Move to the beginning of the node. +#: info/doc.c:39 info/session.c:1237 +msgid "Move to the start of this node" +msgstr "Aller au noeud de départ de ce noeud" + +#. Move to the end of the node. +#: info/doc.c:40 info/session.c:1244 +msgid "Move to the end of this node" +msgstr "Aller au noeud terminal de ce noeud" + +#. **************************************************************** +#. +#. Commands for Manipulating Windows +#. +#. **************************************************************** +#. Make the next window in the chain be the active window. +#: info/doc.c:41 info/session.c:1257 +msgid "Select the next window" +msgstr "Sélectionner la fenêtre suivante" + +#. Make the previous window in the chain be the active window. +#: info/doc.c:42 info/session.c:1296 +msgid "Select the previous window" +msgstr "Sélectionner la fenêtre précédente" + +#. Split WINDOW into two windows, both showing the same node. If we +#. are automatically tiling windows, re-tile after the split. +#: info/doc.c:43 info/session.c:1347 +msgid "Split the current window" +msgstr "Diviser en deux la fenêtre courante" + +#. Delete WINDOW, forgetting the list of last visited nodes. If we are +#. automatically displaying footnotes, show or remove the footnotes +#. window. If we are automatically tiling windows, re-tile after the +#. deletion. +#: info/doc.c:44 info/session.c:1428 +msgid "Delete the current window" +msgstr "Éliminer la fenêtre courante" + +#. Just keep WINDOW, deleting all others. +#: info/doc.c:45 info/session.c:1469 +msgid "Delete all other windows" +msgstr "Éliminer toutes les autres fenêtres" + +#. Scroll the "other" window of WINDOW. +#: info/doc.c:46 info/session.c:1515 +msgid "Scroll the other window" +msgstr "Défiler l'autre fenêtre" + +#. Change the size of WINDOW by AMOUNT. +#: info/doc.c:47 info/session.c:1535 +msgid "Grow (or shrink) this window" +msgstr "Agrandir (ou réduire) cette fenêtre" + +#: info/doc.c:48 info/session.c:1546 +msgid "Divide the available screen space among the visible windows" +msgstr "Répartir l'espace écran disponible parmi les fenêtres visibles" + +#: info/doc.c:49 info/session.c:1553 +msgid "Toggle the state of line wrapping in the current window" +msgstr "Basculer l'état du remplissage de ligne dans la fenêtre courante" + +#. Make WINDOW display the "Next:" node of the node currently being +#. displayed. +#: info/doc.c:50 info/session.c:1714 +#, fuzzy +msgid "Select the `Next' node" +msgstr "Sélectionner la fenêtre suivante" + +#. Make WINDOW display the "Prev:" node of the node currently being +#. displayed. +#: info/doc.c:51 info/session.c:1722 +#, fuzzy +msgid "Select the `Prev' node" +msgstr "Sélection des autres noeuds:" + +#. Make WINDOW display the "Up:" node of the node currently being +#. displayed. +#: info/doc.c:52 info/session.c:1730 +#, fuzzy +msgid "Select the `Up' node" +msgstr "Sélection des autres noeuds:" + +#. Make WINDOW display the last node of this info file. +#: info/doc.c:53 info/session.c:1737 +#, fuzzy +msgid "Select the last node in this file" +msgstr "Sélectionner le premier noeud dans ce fichier" + +#. Make WINDOW display the first node of this info file. +#: info/doc.c:54 info/session.c:1759 +msgid "Select the first node in this file" +msgstr "Sélectionner le premier noeud dans ce fichier" + +#: info/doc.c:55 info/session.c:2401 +msgid "Select the most recently selected node" +msgstr "Choisir le noeud qui a été le plus récemment sélectionné" + +#: info/doc.c:56 info/session.c:1778 +msgid "Select the last item in this node's menu" +msgstr "Sélectionner le dernier item dans ce menu de noeuds" + +#. Use KEY (a digit) to select the Nth menu item in WINDOW->node. +#: info/doc.c:57 info/session.c:1784 +msgid "Select this menu item" +msgstr "Sélectionner cet item menu" + +#. Read a line (with completion) which is the name of a menu item, +#. and select that item. +#: info/doc.c:58 info/session.c:2042 +msgid "Read a menu item and select its node" +msgstr "Lire un item menu et sélectionner son noeud" + +#: info/doc.c:59 info/session.c:2050 +msgid "Read a footnote or cross reference and select its node" +msgstr "" +"Lire une note en bas de page ou une référence croisée et\n" +"sélectionner son noeud." + +#. Position the cursor at the start of this node's menu. +#: info/doc.c:60 info/session.c:2056 +msgid "Move to the start of this node's menu" +msgstr "Aller au point de départ de ce menu de noeud." + +#: info/doc.c:61 info/session.c:2080 +msgid "Visit as many menu items at once as possible" +msgstr "Visiter d'un seul coup autant d'items menu que possible" + +#. Read a line of input which is a node name, and go to that node. +#: info/doc.c:62 info/session.c:2108 +msgid "Read a node name and select it" +msgstr "Lire un nom de noeud et sélectionner ce noeud" + +#: info/doc.c:63 info/session.c:2194 +msgid "Read a manpage reference and select it" +msgstr "Lire une référence de page-manuel et la sélectionner" + +#. Move to the "Top" node in this file. +#: info/doc.c:64 info/session.c:2228 +msgid "Select the node `Top' in this file" +msgstr "Sélectionner le noeud «Top» dans ce fichier" + +#. Move to the node "(dir)Top". +#: info/doc.c:65 info/session.c:2234 +msgid "Select the node `(dir)'" +msgstr "Sélectionner le noeud «(dir)»" + +#. Kill named node. +#: info/doc.c:66 info/session.c:2407 +msgid "Kill this node" +msgstr "Effacer ce noeud" + +#. Read the name of a file and select the entire file. +#: info/doc.c:67 info/session.c:2415 +msgid "Read the name of a file and select it" +msgstr "Lire le nom d'un fichier et le sélectionner" + +#: info/doc.c:68 info/session.c:2634 +msgid "Pipe the contents of this node through INFO_PRINT_COMMAND" +msgstr "Acheminer les contenus de ce noeud à travers INFO_PRINT_COMMAND" + +#: info/doc.c:69 info/session.c:2946 +msgid "Read a string and search for it" +msgstr "Lire une chaîne et en faire la fouille" + +#: info/doc.c:70 info/doc.c:71 info/session.c:3020 info/session.c:3026 +msgid "Search interactively for a string as you type it" +msgstr "Fouiller interactivement pour une chaîne telle que vous la tapez" + +#: info/doc.c:72 info/session.c:3579 +msgid "Move to the previous cross reference" +msgstr "Aller à la référence croisée précédente" + +#: info/doc.c:73 info/session.c:3588 +msgid "Move to the next cross reference" +msgstr "Aller à la prochaine référence croisée" + +#: info/doc.c:74 info/session.c:3598 +msgid "Select reference or menu item appearing on this line" +msgstr "Sélectionner la référence ou l'item menu apparaissant sur cette ligne" + +#. **************************************************************** +#. +#. Miscellaneous Info Commands +#. +#. **************************************************************** +#. What to do when C-g is pressed in a window. +#: info/doc.c:75 info/session.c:3620 +msgid "Cancel current operation" +msgstr "Annuler l'opération courante" + +#: info/doc.c:76 info/session.c:3636 +msgid "Move to the cursor to a specific line of the window" +msgstr "Déplacer le curseur sur une ligne spécifique de la fenêtre." + +#. Clear the screen and redraw its contents. Given a numeric argument, +#. move the line the cursor is on to the COUNT'th line of the window. +#: info/doc.c:77 info/session.c:3668 +msgid "Redraw the display" +msgstr "Redessiner l'affichage écran." + +#. This command does nothing. It is the fact that a key is bound to it +#. that has meaning. See the code at the top of info_session (). +#: info/doc.c:78 info/session.c:3705 +msgid "Quit using Info" +msgstr "Quitter en utilisant Info" + +#: info/doc.c:80 info/session.c:3958 +msgid "Add this digit to the current numeric argument" +msgstr "Ajouter ce chiffre à l'argument numérique courant" + +#: info/doc.c:81 +#, fuzzy +msgid "universal-argument" +msgstr "Utilisé internement par \\[universal-argument]" + +#: info/doc.c:81 info/session.c:3967 +msgid "Start (or multiply by 4) the current numeric argument" +msgstr "Enclencher (ou multipler par 4) l'argument numérique courant" + +#: info/doc.c:82 info/session.c:3982 +msgid "Internally used by \\[universal-argument]" +msgstr "Utilisé internement par \\[universal-argument]" + +#: info/doc.c:86 info/echo-area.c:307 +msgid "Move to the start of this line" +msgstr "Se déplacer au début de cette ligne" + +#: info/doc.c:87 info/echo-area.c:312 +msgid "Move to the end of this line" +msgstr "Se déplacer à la fin de cette ligne" + +#: info/doc.c:90 info/echo-area.c:400 +msgid "Delete the character under the cursor" +msgstr "Éliminer le caractère sous le curseur" + +#: info/doc.c:91 info/echo-area.c:430 +msgid "Delete the character behind the cursor" +msgstr "Éliminer le caractère précédent le curseur" + +#: info/doc.c:92 info/echo-area.c:451 +msgid "Cancel or quit operation" +msgstr "Annuler ou opération de quitter" + +#: info/doc.c:93 info/echo-area.c:466 +msgid "Accept (or force completion of) this line" +msgstr "Accepter cette ligne (ou en forcer la complétion)" + +#: info/doc.c:94 info/echo-area.c:471 +msgid "Insert next character verbatim" +msgstr "Insérer le prochain caractère textuellement" + +#: info/doc.c:95 info/echo-area.c:479 +msgid "Insert this character" +msgstr "Insérer ce caractère" + +#: info/doc.c:96 info/echo-area.c:497 +msgid "Insert a TAB character" +msgstr "Insérer un caractère de tabulation" + +#. Transpose the characters at point. If point is at the end of the line, +#. then transpose the characters before point. +#: info/doc.c:97 info/echo-area.c:504 +msgid "Transpose characters at point" +msgstr "Transposer les caractères en position du point courant" + +#: info/doc.c:98 info/echo-area.c:555 +msgid "Yank back the contents of the last kill" +msgstr "Recoller le contenu du dernier effacement" + +#. If the last command was yank, or yank_pop, and the text just before +#. point is identical to the current kill item, then delete that text +#. from the line, rotate the index down, and yank back some other text. +#: info/doc.c:99 info/echo-area.c:575 +msgid "Yank back a previous kill" +msgstr "Recoller un effacement antérieur" + +#. Delete the text from point to end of line. +#: info/doc.c:100 info/echo-area.c:608 +msgid "Kill to the end of the line" +msgstr "Effacer du point courant jusqu'à la fin de la ligne" + +#: info/doc.c:101 info/echo-area.c:621 +msgid "Kill to the beginning of the line" +msgstr "Effacer du point courant jusqu'au début de la ligne" + +#. Delete from point to the end of the current word. +#: info/doc.c:102 info/echo-area.c:633 +msgid "Kill the word following the cursor" +msgstr "Effacer le mot suivant le curseur" + +#: info/doc.c:103 info/echo-area.c:652 +msgid "Kill the word preceding the cursor" +msgstr "Effacer le mot précédent le curseur" + +#: info/doc.c:104 info/echo-area.c:916 +msgid "List possible completions" +msgstr "Énumérer les complétions possibles" + +#: info/doc.c:105 info/echo-area.c:1090 +msgid "Insert completion" +msgstr "Insérer la complétion" + +#. Scroll the "other" window. If there is a window showing completions, scroll +#. that one, otherwise scroll the window which was active on entering the read +#. function. +#: info/doc.c:106 info/echo-area.c:1321 +msgid "Scroll the completions window" +msgstr "Dérouler la fenêtre des complétions" + +#. Commands found in "./infodoc.c". +#: info/doc.c:108 info/infodoc.c:328 +msgid "Display help message" +msgstr "Afficher le message d'aide" + +#. Show the Info help node. This means that the "info" file is installed +#. where it can easily be found on your system. +#: info/doc.c:109 info/infodoc.c:346 +msgid "Visit Info node `(info)Help'" +msgstr "Visiter le noeud Info «(info)Aide»" + +#: info/doc.c:110 info/infodoc.c:470 +msgid "Print documentation for KEY" +msgstr "Imprimer la documentation pour KEY." + +#: info/doc.c:111 +msgid "Show what to type to execute a given command" +msgstr "Montrer quoi écrire afin d'exécuter une commande donnée." + +#. Commands found in "./m-x.c". +#: info/doc.c:113 info/m-x.c:69 +msgid "Read the name of an Info command and describe it" +msgstr "Lire le nom d'une commande Info et la décrire" + +#: info/doc.c:114 info/m-x.c:96 +msgid "Read a command name in the echo area and execute it" +msgstr "Lire le nom d'une commande dans la zone écho et l'exécuter" + +#: info/doc.c:115 info/m-x.c:150 +msgid "Set the height of the displayed window" +msgstr "Ajuster la hauteur de la fenêtre affichée" + +#. Commands found in "./indices.c". +#: info/doc.c:117 info/indices.c:175 +msgid "Look up a string in the index for this file" +msgstr "Rechercher une chaîne dans l'index pour ce fichier" + +#: info/doc.c:118 info/indices.c:332 +msgid "" +"Go to the next matching index item from the last `\\[index-search]' command" +msgstr "" +"Aller au prochain item d'appariement d'index à partir de la dernière\n" +"commande `\\[index-search]'" + +#: info/doc.c:119 info/indices.c:616 +msgid "Grovel all known info file's indices for a string and build a menu" +msgstr "" +"Aplatir tous les indices de fichier info connus pour une chaîne\n" +"et construire un menu" + +#. Commands found in "./nodemenu.c". +#: info/doc.c:121 info/nodemenu.c:217 +msgid "Make a window containing a menu of all of the currently visited nodes" +msgstr "Faire une fenêtre contenant un menu de tout noeud actuellement visité." + +#: info/doc.c:122 info/nodemenu.c:297 +msgid "Select a node which has been previously visited in a visible window" +msgstr "Sélectionner un noeud qui a déjà été visité dans une fenêtre visible." + +#. Commands found in "./footnotes.c". +#: info/doc.c:124 info/footnotes.c:232 +msgid "Show the footnotes associated with this node in another window" +msgstr "" +"Montrer les notes en bas de page associées à ce noeud dans\n" +"une autre fenêtre" + +#. Commands found in "./variables.c". +#: info/doc.c:126 info/variables.c:77 +msgid "Explain the use of a variable" +msgstr "Expliquer l'usage d'une variable" + +#: info/doc.c:127 info/variables.c:102 +msgid "Set the value of an Info variable" +msgstr "Fixer la valeur d'une variable Info" + +#: info/echo-area.c:562 +msgid "Kill ring is empty" +msgstr "L'anneau des effacements temporaires est vide" + +#: info/echo-area.c:871 +msgid "Not complete" +msgstr "Non complet" + +#: info/echo-area.c:929 +msgid "No completions" +msgstr "Aucune complétion" + +#: info/echo-area.c:933 +msgid "Sole completion" +msgstr "Une seule complétion" + +#: info/echo-area.c:942 +#, c-format +msgid "There %s %d " +msgstr "Comme complétion(s) %s %d " + +#: info/echo-area.c:942 +msgid "is" +msgstr "il y a" + +#: info/echo-area.c:942 +msgid "are" +msgstr "il y a" + +#: info/echo-area.c:945 +#, fuzzy, c-format +msgid "completion%s:\n" +msgstr "Aucune complétion" + +#: info/echo-area.c:1223 +msgid "Building completions..." +msgstr "Construction des complétions..." + +#: info/footnotes.c:206 +msgid "Footnotes could not be displayed" +msgstr "Les notes en bas de page ne peuvent pas être affichées" + +#: info/indices.c:205 +msgid "Finding index entries..." +msgstr "Recherche des entrées d'index..." + +#: info/indices.c:212 +msgid "No indices found." +msgstr "Aucun indice retrouvé." + +#: info/indices.c:222 +msgid "Index entry: " +msgstr "Entrée d'index: " + +#: info/indices.c:342 +msgid "No previous index search string." +msgstr "Aucune autre chaîne de fouille d'index." + +#: info/indices.c:349 +msgid "No index entries." +msgstr "Aucune entrée d'index." + +#: info/indices.c:382 +#, c-format +msgid "No %sindex entries containing \"%s\"." +msgstr "Aucune entrée %sindex contenant «%s»." + +#: info/indices.c:383 +msgid "more " +msgstr "plus " + +#: info/indices.c:393 +msgid "CAN'T SEE THIS" +msgstr "NE PEUT PAS VOIR CECI" + +#: info/indices.c:429 +#, c-format +msgid "Found \"%s\" in %s. (`\\[next-index-match]' tries to find next.)" +msgstr "" +"Trouver «%s» dans %s. (`\\[next-index-match]' tente de trouver\n" +"le prochain.)" + +#: info/indices.c:533 +#, c-format +msgid "Scanning indices of \"%s\"..." +msgstr "Fouille des indices de «%s»..." + +#: info/indices.c:620 +msgid "Index apropos: " +msgstr "Index à-propos: " + +#: info/indices.c:650 +#, c-format +msgid "" +"\n" +"* Menu: Nodes whoses indices contain \"%s\":\n" +msgstr "" +"\n" +"* Menu: Noeuds dont les indices contiennent «%s»:\n" + +#: info/info.c:347 +#, fuzzy +msgid "no entries found\n" +msgstr "Aucun indice retrouvé." + +#: info/info.c:390 +msgid "There is no menu in this node." +msgstr "Il n'y a pas de menu dans ce noeud." + +#: info/info.c:421 +#, c-format +msgid "There is no menu item \"%s\" in this node." +msgstr "Il n'y a pas d'item menu «%s» dans ce noeud." + +#: info/info.c:485 +#, c-format +msgid "Unable to find the node referenced by \"%s\"." +msgstr "Incappable de trouver le noeud référencé par «%s»." + +# Est-ce vraiment un message à traduire? NON. +#: info/info.c:595 +msgid "" +"Usage: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]..." +msgstr "" +"Usage: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]..." + +# Est-ce vraiment un message à traduire? NON. +#: info/info.c:596 +msgid "" +" [--directory dir-path] [--file info-file] [--node node-name]..." +msgstr "" +" [--directory dir-path] [--file info-file] [--node node-name]..." + +# Est-ce vraiment un message à traduire? NON. +#: info/info.c:597 +msgid " [--help] [--output output-file] [--subnodes] [--version]" +msgstr " [--help] [--output output-file] [--subnodes] [--version]" + +# Est-ce vraiment un message à traduire? NON. +#: info/info.c:598 +msgid " [--dribble dribble-file] [--restore from-file]" +msgstr " [--dribble dribble-file] [--restore from-file]" + +# Est-ce vraiment un message à traduire? NON. +#: info/info.c:599 +msgid " [menu-selection ...]" +msgstr " [menu-selection ...]" + +#: info/info.c:607 +#, fuzzy +msgid "" +"Here is a quick description of Info's options. For a more complete\n" +"description of how to use Info, type `info info options'.\n" +"\n" +" --directory DIR Add DIR to INFOPATH.\n" +" --dribble FILENAME Remember user keystrokes in FILENAME.\n" +" --file FILENAME Specify Info file to visit.\n" +" --node NODENAME Specify nodes in first visited Info file.\n" +" --output FILENAME Output selected nodes to FILENAME.\n" +" --restore FILENAME Read initial keystrokes from FILENAME.\n" +" --subnodes Recursively output menu items.\n" +" --help Get this help message.\n" +" --version Display Info's version information.\n" +"\n" +"Remaining arguments to Info are treated as the names of menu\n" +"items in the initial node visited. You can easily move to the\n" +"node of your choice by specifying the menu names which describe\n" +"the path to that node. For example, `info emacs buffers'.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" +"Voici une brève description des options en mode Info.\n" +"Pour une description plus détaillée sur le comment utiliser le mode Info,\n" +"tapper «info info options».\n" +"\n" +" --directory RÉP Ajouter le RÉPertoire à INFOPATH.\n" +" --dribble FICHIER Mémoriser les touches de l'usager dans FICHIER.\n" +" --file FICHIER Spécifier le FICHIER Info à visiter.\n" +" --node NOEUD Spécifier les noms de NOEUD à visiter en premier.\n" +" --output FICHIER Sortir les noeuds sélectionnés dans FICHIER.\n" +" --restore FICHIER Lire les touches initiales à partir de FICHIER.\n" +" --subnodes Sortir récursivement les items menu.\n" +" --help Afficher l'aide-mémoire.\n" +" --version Afficher le nom et la version du logiciel.\n" +"\n" +"Les arguments résiduels à Info sont traités comme étant les noms des items\n" +"menu dans le noeud initial visité. Vous pouvez aisément rejoindre le\n" +"noeud de votre choix en spécifiant les noms de menu lesquels décrivent\n" +"le chemin de ce noeud. Par exemple, «info emacs buffers».\n" +"\n" +"Rapporter toute anomalie à bug-texinfo@prep.ai.mit.edu." + +#: info/infodoc.c:50 +msgid "Basic Commands in Info Windows" +msgstr "Commandes de base en Info Windows" + +#: info/infodoc.c:211 +msgid "" +"The following commands can only be invoked via M-x:\n" +"\n" +msgstr "" +"Les commandes suivantes peuvent être invoquées seulement via M-x:\n" +"\n" + +#: info/infodoc.c:228 +msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n" +msgstr "--- Utiliser `\\[history-node]' ou `\\[kill-node]' pour sortir ---\n" + +#: info/infodoc.c:483 +#, c-format +msgid "Describe key: %s" +msgstr "Décrire la clé: %s" + +#: info/infodoc.c:492 +#, c-format +msgid "ESC %s is undefined." +msgstr "ESC %s est non défini." + +#: info/infodoc.c:509 +#, c-format +msgid "%s is undefined." +msgstr "%s est non défini." + +#: info/infodoc.c:535 +#, c-format +msgid "%s is defined to %s." +msgstr "%s est défini à %s." + +#: info/infodoc.c:731 +msgid "Where is command: " +msgstr "Où se trouve la commande: " + +#: info/infodoc.c:753 +#, c-format +msgid "`%s' is not on any keys" +msgstr "`%s' ne se trouve pas sur n'importe quelle clé" + +#: info/infodoc.c:759 +#, c-format +msgid "%s can only be invoked via %s." +msgstr "%s peut être invoqué seulement via %s." + +#: info/infodoc.c:762 +#, c-format +msgid "%s can be invoked via %s." +msgstr "%s peut être invoqué via %s." + +#: info/infodoc.c:766 +#, c-format +msgid "There is no function named `%s'" +msgstr "Il n'y a pas de fonction nommée `%s'" + +#: info/m-x.c:73 +msgid "Describe command: " +msgstr "Décrire la commande: " + +#: info/m-x.c:134 +msgid "Cannot execute an `echo-area' command here." +msgstr "Ne peut pas exécuter une commande «echo-area» en cet endroit." + +#: info/m-x.c:163 +#, c-format +msgid "Set screen height to (%d): " +msgstr "Ajuster la hauteur de l'écran à (%d): " + +#: info/makedoc.c:126 +msgid "" +" Source files groveled to make this file include:\n" +"\n" +msgstr "" +" Les fichiers sources aplatis pour faire ce fichier incluent:\n" +"\n" + +#: info/makedoc.c:450 +#, c-format +msgid "Couldn't manipulate the file %s.\n" +msgstr "Ne peut pas manipuler le fichier %s.\n" + +#: info/nodemenu.c:28 +msgid "" +"\n" +"* Menu:\n" +" (File)Node Lines Size Containing File\n" +" ---------- ----- ---- ---------------" +msgstr "" +"\n" +"* Menu:\n" +" (Fichier)Noeud Lignes Taille Contenant Fichier(s)\n" +" -------------- ------ ------ --------------------" + +#: info/nodemenu.c:197 +msgid "" +"Here is the menu of nodes you have recently visited.\n" +"Select one from this menu, or use `\\[history-node]' in another window.\n" +msgstr "" +"Voici le menu de noeuds que vous avez visité récemment.\n" +"Sélectionner un noeud de ce menu, ou utiliser `\\[history-node]' dans\n" +"une autre fenêtre.\n" + +#: info/nodemenu.c:309 +msgid "Select visited node: " +msgstr "Sélectionner un noeud visité: " + +#: info/nodemenu.c:329 info/session.c:1996 +#, c-format +msgid "The reference disappeared! (%s)." +msgstr "La référence est disparue! (%s)." + +#: info/session.c:162 +#, c-format +msgid "" +"Welcome to Info version %s. \"\\[get-help-window]\" for help, " +"\"\\[menu-item]\" for menu item." +msgstr "" +"Bienvenue au mode Info version %s.\n" +" \"\\[get-help-window]\" pour obtenir de l'aide,\n" +" \"\\[menu-item]\" pour obtenir l'item menu." + +#: info/session.c:855 +msgid " times" +msgstr " fois" + +#: info/session.c:857 +#, c-format +msgid "%d times" +msgstr "%d fois" + +#: info/session.c:895 +msgid "No \"Next\" pointer for this node." +msgstr "Aucun pointeur «Next» pour ce noeud." + +#: info/session.c:898 +msgid "Following \"Next\" node..." +msgstr "En suivant le noeud «Next»..." + +#: info/session.c:899 info/session.c:927 info/session.c:999 +#: info/session.c:1717 +msgid "Next" +msgstr "Noeud Next" + +#: info/session.c:915 +msgid "Selecting first menu item..." +msgstr "Sélection du premier item menu..." + +#: info/session.c:926 +msgid "Selecting \"Next\" node..." +msgstr "Sélection du noeud «Next»..." + +# Est-ce vraiment un message à traduire? +#: info/session.c:950 info/session.c:1063 info/session.c:1733 +msgid "Up" +msgstr "Noeud «Up»" + +#: info/session.c:1020 +msgid "No more nodes." +msgstr "Aucun autre noeud." + +#: info/session.c:1044 +msgid "No \"Prev\" for this node." +msgstr "Aucun noeud «Prev» pour ce noeud." + +#. Move to the previous node. If this node now contains a menu, +#. and we have not inhibited movement to it, move to the node +#. corresponding to the last menu item. +#: info/session.c:1047 info/session.c:1100 +msgid "Moving \"Prev\" in this window." +msgstr "Monter au noeud «Prev» dans cette fenêtre." + +# Est-ce vraiment un message à traduire? +#: info/session.c:1048 info/session.c:1101 info/session.c:1725 +msgid "Prev" +msgstr "Noeud «Prev»" + +#: info/session.c:1059 +msgid "No \"Prev\" or \"Up\" for this node." +msgstr "Aucun noeud «Prev» ou «Up» pour ce noeud." + +#: info/session.c:1062 +msgid "Moving \"Up\" in this window." +msgstr "Aller au noeud «Up» dans cette fenêtre." + +#: info/session.c:1110 +msgid "Moving to \"Prev\"'s last menu item." +msgstr "Aller au dernier item menu du noeud «Prev»." + +#: info/session.c:1436 +msgid "Cannot delete a permanent window" +msgstr "Ne peut pas éliminer une fenêtre permanente" + +#: info/session.c:1750 info/session.c:1768 +msgid "This window has no additional nodes" +msgstr "Cette fenêtre a aucun noeud additionnel" + +#: info/session.c:1813 +#, c-format +msgid "There aren't %d items in this menu." +msgstr "Il n'y a pas %d items dans ce menu." + +#: info/session.c:1944 +#, c-format +msgid "Menu item (%s): " +msgstr "Item menu (%s): " + +#: info/session.c:1946 +msgid "Menu item: " +msgstr "Item menu: " + +#: info/session.c:1951 +#, c-format +msgid "Follow xref (%s): " +msgstr "Suivre xref (%s): " + +#: info/session.c:1953 +msgid "Follow xref: " +msgstr "Suivre xref: " + +#: info/session.c:2169 info/session.c:2173 +msgid "Goto Node: " +msgstr "Aller au Noeud: " + +#: info/session.c:2198 +msgid "Get Manpage: " +msgstr "Obtenir la Page-manuel: " + +#. Notice that the node "Top" is special, and doesn't have to +#. be referenced. +#: info/session.c:2230 makeinfo/makeinfo.c:5135 makeinfo/makeinfo.c:5218 +msgid "Top" +msgstr "Noeud «Top»" + +#: info/session.c:2254 +#, fuzzy, c-format +msgid "Kill node (%s): " +msgstr "Suivre xref (%s): " + +#: info/session.c:2307 +#, fuzzy, c-format +msgid "Cannot kill node `%s'" +msgstr "Ne peut pas effacer le dernier noeud" + +#: info/session.c:2317 +msgid "Cannot kill the last node" +msgstr "Ne peut pas effacer le dernier noeud" + +#: info/session.c:2419 +msgid "Find file: " +msgstr "Trouver le fichier: " + +#: info/session.c:2436 +#, c-format +msgid "Cannot find \"%s\"." +msgstr "Ne peut pas trouver le fichier «%s»." + +#: info/session.c:2483 info/session.c:2608 +#, c-format +msgid "Could not create output file \"%s\"." +msgstr "Ne peut pas créer le fichier de sortie «%s»." + +#: info/session.c:2496 info/session.c:2625 info/session.c:2671 +msgid "Done." +msgstr "Terminé." + +#: info/session.c:2553 +#, c-format +msgid "Writing node \"(%s)%s\"..." +msgstr "Écriture du noeud «(%s)%s»..." + +#: info/session.c:2556 +#, c-format +msgid "Writing node \"%s\"..." +msgstr "Écriture du noeud «%s»..." + +#: info/session.c:2654 +#, c-format +msgid "Cannot open pipe to \"%s\"." +msgstr "Ne peut pas ouvrir un tube de communication à «%s»." + +#: info/session.c:2661 +#, c-format +msgid "Printing node \"(%s)%s\"..." +msgstr "Impression du noeud «(%s)%s»..." + +#: info/session.c:2664 +#, c-format +msgid "Printing node \"%s\"..." +msgstr "Impression du noeud «%s»..." + +#: info/session.c:2896 +#, c-format +msgid "Searching subfile \"%s\"..." +msgstr "Fouille du sous-fichier «%s»..." + +#: info/session.c:2966 +#, c-format +msgid "%s for string [%s]: " +msgstr "%s pour la chaîne [%s]: " + +#: info/session.c:2967 +msgid "Search backward" +msgstr "Fouiller vers l'arrière" + +#: info/session.c:2967 +msgid "Search" +msgstr "Fouiller" + +#: info/session.c:2994 +msgid "Search failed." +msgstr "Fouille infructueuse." + +#: info/session.c:3120 +msgid "I-search backward: " +msgstr "Fouille I-search vers l'arrière: " + +#: info/session.c:3122 +msgid "I-search: " +msgstr "Fouille I-search: " + +#: info/session.c:3147 +msgid "Failing " +msgstr "Échec " + +#: info/session.c:3512 +msgid "No cross references in this node." +msgstr "Aucune référence croisée dans ce noeud." + +#: info/session.c:3627 +msgid "Quit" +msgstr "Quitter" + +#: info/session.c:3728 +#, c-format +msgid "Unknown command (%s)." +msgstr "Commande inconnue (%s)." + +# Est-ce que c'est " " ou « » comme caractères? +#: info/session.c:3733 +msgid "\"\" is invalid" +msgstr "\"\" est invalide" + +#: info/session.c:3735 +#, c-format +msgid "\"%s\" is invalid" +msgstr "«%s» est invalide" + +#: info/variables.c:40 +msgid "When \"On\", footnotes appear and disappear automatically" +msgstr "" +"Lorsque «On» est en fonction, les notes en bas de page apparaissent\n" +"et disparaissent automatiquement" + +#: info/variables.c:44 +msgid "When \"On\", creating or deleting a window resizes other windows" +msgstr "" +"Lorsque «On» est en fonction, la création ou l'effacement d'une fenêtre\n" +"réajuste la dimension des autres fenêtres" + +#: info/variables.c:48 +msgid "When \"On\", flash the screen instead of ringing the bell" +msgstr "" +"Lorsque «On» est en fonction, un clignotement d'écran est utilisé plutôt\n" +"qu'un bruit de cloche" + +#: info/variables.c:52 +msgid "When \"On\", errors cause the bell to ring" +msgstr "" +"Lorsque «On» est en fonction, les erreurs sont signalées par un\n" +"bruit de cloche" + +#: info/variables.c:56 +msgid "When \"On\", Info garbage collects files which had to be uncompressed" +msgstr "" +"Lorsque «On» est en fonction, le ramasse-miette Info récolte les fichiers\n" +"qui devaient être décomprimés" + +#: info/variables.c:59 +msgid "When \"On\", the portion of the matched search string is highlighted" +msgstr "" +"Lorsque «On» est en fonction, la portion de la chaîne de fouille appariée\n" +"est mise en surbrillance" + +#: info/variables.c:63 +msgid "Controls what happens when scrolling is requested at the end of a node" +msgstr "" +"Contrôler ce qui arrive lorsqu'un défilement d'écran est requis à la fin\n" +"d'un noeud" + +#: info/variables.c:67 +msgid "The number lines to scroll when the cursor moves out of the window" +msgstr "Le nombre de lignes à défiler quand le curseur va hors de la fenêtre" + +#: info/variables.c:71 +msgid "When \"On\", Info accepts and displays ISO Latin characters" +msgstr "" +"Lorsque «On» est en fonction, Info accepte et affiche les caractères\n" +"ISO Latin" + +#. Get the variable's name. +#: info/variables.c:83 +msgid "Describe variable: " +msgstr "Décrire la variable: " + +#. Get the variable's name and value. +#: info/variables.c:108 +msgid "Set variable: " +msgstr "Fixer la variable: " + +#: info/variables.c:126 +#, c-format +msgid "Set %s to value (%d): " +msgstr "Fixer %s à la valeur (%d): " + +#: info/variables.c:167 +#, c-format +msgid "Set %s to value (%s): " +msgstr "Fixer %s à la valeur (%s): " + +# Est-ce vraiment un message à traduire? +#: info/window.c:1102 +msgid "--*** Tags out of Date ***" +msgstr "--*** Étiquettes passées Date ***" + +#. strlen (location_indicator). +#. 10 for the decimal representation of the number of lines in this +#. node, and the remainder of the text that can appear in the line. +#: info/window.c:1113 +msgid "-----Info: (), lines ----, " +msgstr "-----Info: (), lignes ----, " + +#: info/window.c:1120 +#, c-format +msgid "-%s---Info: %s, %d lines --%s--" +msgstr "-%s---Info: %s, %d lignes --%s--" + +#: info/window.c:1124 +#, c-format +msgid "-%s%s-Info: (%s)%s, %d lines --%s--" +msgstr "-%s%s-Info: (%s)%s, %d lignes --%s--" + +#: info/window.c:1131 +#, c-format +msgid " Subfile: %s" +msgstr " Sous-fichier: %s" + +#: makeinfo/makeinfo.c:889 +#, fuzzy, c-format +msgid "%s:%d: warning: " +msgstr "%s:%d: AVERTISSEMENT: " + +#: makeinfo/makeinfo.c:912 +msgid "Too many errors! Gave up.\n" +msgstr "Beaucoup trop d'erreurs! Abandon.\n" + +#: makeinfo/makeinfo.c:971 makeinfo/makeinfo.c:996 makeinfo/makeinfo.c:1064 +#, fuzzy, c-format +msgid "%s: %s arg must be numeric, not `%s'.\n" +msgstr "" +"Le paramètre %s de l'option --error-limit doit être numérique,\n" +"et non pas `%s'.\n" + +#: makeinfo/makeinfo.c:985 +#, fuzzy, c-format +msgid "Couldn't open macro expansion output `%s'" +msgstr "Ne peut ouvrir la sortie d'expansion de macro «%s»\"" + +#: makeinfo/makeinfo.c:988 +msgid "Cannot specify more than one macro expansion output" +msgstr "Ne peut spécifier plus d'une sortie d'expansion de macro" + +#: makeinfo/makeinfo.c:1032 +#, fuzzy, c-format +msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n" +msgstr "" +"Le paramètre %s de l'option --paragraph-indent doit être numérique\n" +"ou nul ou «asis», et non pas `%s'.\n" + +#: makeinfo/makeinfo.c:1075 +#, c-format +msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n" +msgstr "" +"Le paramètre %s de l'option --footnote-style doit être «separate»\n" +"ou «end», et non pas `%s'.\n" + +#: makeinfo/makeinfo.c:1085 util/install-info.c:522 util/texindex.c:348 +msgid "" +"Copyright (C) 1996 Free Software Foundation, Inc.\n" +"There is NO warranty. You may redistribute this software\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the files named COPYING." +msgstr "" +"Copyright (C) 1996 Free Software Foundation, Inc.\n" +"AUCUNE garantie n'est donnée; tant pour des raisons COMMERCIALES que\n" +"pour RÉPONDRE À UN BESOIN PARTICULIER. Vous pouvez redistribuer des copies\n" +"de ce logiciel selon les termes de la licence GNU General Public License.\n" +"Pour plus d'informations, consultez le fichier COPYING." + +#: makeinfo/makeinfo.c:1105 +#, c-format +msgid "%s: missing file argument.\n" +msgstr "%s: absence d'un argument fichier.\n" + +#: makeinfo/makeinfo.c:1146 +#, c-format +msgid "makeinfo (GNU %s %s) %d.%d\n" +msgstr "" + +#: makeinfo/makeinfo.c:1158 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Pour en savoir davantage, faites: `%s --help'.\n" + +#: makeinfo/makeinfo.c:1160 +#, fuzzy, c-format +msgid "" +"Usage: %s [OPTION]... TEXINFO-FILE...\n" +"\n" +"Translate Texinfo source documentation to a format suitable for reading\n" +"with GNU Info.\n" +"\n" +"Options:\n" +"-D VAR define a variable, as with @set.\n" +"-E MACRO-OFILE process macros only, output texinfo source.\n" +"-I DIR append DIR to the @include directory search path.\n" +"-P DIR prepend DIR to the @include directory search path.\n" +"-U VAR undefine a variable, as with @clear.\n" +"--error-limit NUM quit after NUM errors (default %d).\n" +"--fill-column NUM break lines at NUM characters (default %d).\n" +"--footnote-style STYLE output footnotes according to STYLE:\n" +" `separate' to place footnotes in their own node,\n" +" `end' to place the footnotes at the end of\n" +" the node in which they are defined (the default).\n" +"--force preserve output even if errors.\n" +"--help display this help and exit.\n" +"--no-validate suppress node cross-reference validation.\n" +"--no-warn suppress warnings (but not errors).\n" +"--no-split suppress splitting of large files.\n" +"--no-headers suppress node separators and Node: Foo headers.\n" +"--output FILE, -o FILE output to FILE, and ignore any @setfilename.\n" +"--paragraph-indent VAL indent paragraphs with VAL spaces (default %d).\n" +" if VAL is `none', do not indent; if VAL is `asis',\n" +" preserve any existing indentation.\n" +"--reference-limit NUM complain about at most NUM references (default %d).\n" +"--verbose report about what is being done.\n" +"--version display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" +"Usage: %s [OPTION]... TEXINFO-FILE...\n" +"\n" +"Traduire une documentation source en format Texinfo vers un format " +"approprié\n" +"pour une lecture avec GNU Info.\n" +"\n" +"Options:\n" +"-D VAR Définir une variable, comme avec @set.\n" +"-E MACRO-OFILE Exécuter les macros seulement, sortir un source " +"texinfo.\n" +"-I DIR Ajouter DIR dans la fouille de répertoires pour " +"@include.\n" +"-U VAR Rendre indéfinie une variable, comme avec @clear.\n" +"--error-limit NUM Quitter après NUM erreurs (par défaut %d).\n" +"--fill-column NUM Tronquer les lignes à NUM caractères (par défaut " +"%d).\n" +"--footnote-style STYLE Sortir les notes en bas de page selon l'option " +"STYLE:\n" +" «separate» pour placer les notes dans leur propre " +"noeud,\n" +" «end» pour les placer à la fin du noeud dans lequel\n" +" elles ont été définies (valeur par défaut).\n" +"--help Afficher l'aide-mémoire.\n" +"--no-validate Supprimer la validation de la table de référence\n" +" des noeuds.\n" +"--no-warn Supprimer les avertissements (mais pas les erreurs).\n" +"--no-split Supprimer la troncation de fichiers volumineux.\n" +"--no-headers Supprimer les séparateurs de noeud et Node: Foo " +"headers.\n" +"--output FICHIER, -o FICHIER Écrire dans le FICHIER, et ignorer tous\n" +" les @setfilename.\n" +"--paragraph-indent NUM Indenter les paragraphes de NUM espaces (%d par " +"défaut).\n" +"--reference-limit NUM Avertir après plus de NUM références (%d par " +"défaut).\n" +"--verbose Utiliser le mode bavard et indiquer ce qui a été " +"fait.\n" +"--version Afficher le nom et la version du logiciel.\n" +"\n" +"Rapporter toute anomalie à bug-texinfo@prep.ai.mit.edu.\n" + +#: makeinfo/makeinfo.c:1545 +#, c-format +msgid "%s: getwd: %s, %s\n" +msgstr "" + +#: makeinfo/makeinfo.c:1741 +#, c-format +msgid "Expected `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2072 +#, c-format +msgid "No `%s' found in `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2122 +#, c-format +msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2141 +#, c-format +msgid "Making %s file `%s' from `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2171 +#, c-format +msgid "This is Info file %s, produced by Makeinfo version %d.%d" +msgstr "" + +#: makeinfo/makeinfo.c:2173 +#, fuzzy, c-format +msgid " from the input file %s.\n" +msgstr "Ne peut pas créer le fichier de sortie «%s»." + +#: makeinfo/makeinfo.c:2192 +#, c-format +msgid "" +"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. If there were errors, and no --force, remove the output. +#: makeinfo/makeinfo.c:2224 +#, c-format +msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. Special case. I'm not supposed to see this character by itself. +#. If I do, it means there is a syntax error in the input text. +#. Report the error here, but remember this brace on the stack so +#. you can ignore its partner. +#: makeinfo/makeinfo.c:2364 makeinfo/makeinfo.c:7624 +#, fuzzy, c-format +msgid "Misplaced %c" +msgstr "Accolade «}» égarée ou mal placée" + +#: makeinfo/makeinfo.c:2451 +#, fuzzy, c-format +msgid "Unknown command `%s'" +msgstr "Commande inconnue (%s)." + +#: makeinfo/makeinfo.c:2471 +msgid "NO_NAME!" +msgstr "" + +#: makeinfo/makeinfo.c:2485 +#, c-format +msgid "%c%s expected `{...}'" +msgstr "" + +#: makeinfo/makeinfo.c:2518 +#, fuzzy +msgid "Unmatched }" +msgstr "`%c%s' non apparié" + +#: makeinfo/makeinfo.c:2566 +#, fuzzy, c-format +msgid "%c%s missing close brace" +msgstr "%s: absence d'un argument fichier.\n" + +#: makeinfo/makeinfo.c:3362 +msgid "Broken-Type in insertion_type_pname" +msgstr "" + +#: makeinfo/makeinfo.c:3428 +msgid "Enumeration stack overflow" +msgstr "" + +#: makeinfo/makeinfo.c:3460 +#, c-format +msgid "lettering overflow, restarting at %c" +msgstr "" + +#: makeinfo/makeinfo.c:3499 +#, fuzzy +msgid "* Menu:\n" +msgstr "Menu" + +#: makeinfo/makeinfo.c:3583 +#, fuzzy, c-format +msgid "%s requires an argument: the formatter for %citem" +msgstr "%s nécessite une lettre ou un chiffre" + +#: makeinfo/makeinfo.c:3687 +#, c-format +msgid "`%cend' expected `%s', but saw `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:3800 +#, fuzzy, c-format +msgid "No matching `%cend %s'" +msgstr "`%c%s' non apparié" + +#: makeinfo/makeinfo.c:3939 +#, c-format +msgid "How did @%s end up in cm_special_char?\n" +msgstr "" + +#. This error message isn't perfect if the argument is multiple +#. characters, but it doesn't seem worth getting right. +#: makeinfo/makeinfo.c:3953 +#, c-format +msgid "%c%s expects `i' or `j' as argument, not `%c'" +msgstr "" + +#: makeinfo/makeinfo.c:3957 +#, c-format +msgid "%c%s expects a single character `i' or `j' as argument" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "January" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "February" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +#, fuzzy +msgid "March" +msgstr "Fouiller" + +#: makeinfo/makeinfo.c:3969 +msgid "April" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "May" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "June" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "July" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "August" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "September" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "October" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "November" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "December" +msgstr "" + +#: makeinfo/makeinfo.c:3976 +#, c-format +msgid "%d %s %d" +msgstr "" + +#: makeinfo/makeinfo.c:4029 +#, c-format +msgid "%c%s expects a single character as an argument" +msgstr "" + +#: makeinfo/makeinfo.c:4143 +#, c-format +msgid "%c%s is obsolete" +msgstr "" + +#: makeinfo/makeinfo.c:4315 +#, c-format +msgid "There already is a node having %ctop as a section" +msgstr "" + +#: makeinfo/makeinfo.c:4327 +#, c-format +msgid "Here is the %ctop node" +msgstr "" + +#: makeinfo/makeinfo.c:4346 +#, c-format +msgid "%ctop used before %cnode, defaulting to %s" +msgstr "" + +#: makeinfo/makeinfo.c:4421 +#, c-format +msgid "%c%s is obsolete; use %c%s instead" +msgstr "" + +#: makeinfo/makeinfo.c:4670 +#, fuzzy, c-format +msgid "Node `%s' multiply defined (line %d is first definition at)" +msgstr "" +"Le noeud `%s' a de multiples définitions (%d est la première\n" +"définition)" + +#: makeinfo/makeinfo.c:4743 +#, fuzzy, c-format +msgid "Formatting node %s...\n" +msgstr "Écriture du noeud «%s»..." + +#: makeinfo/makeinfo.c:4792 +#, c-format +msgid "Node `%s' requires a sectioning command (e.g. %c%s)" +msgstr "Le noeud `%s' nécessite une commande de subdivision (e.g. %c%s)" + +#: makeinfo/makeinfo.c:5075 +#, c-format +msgid "Node `%s''s Next field not pointed back to" +msgstr "Le champ Next du noeud `%s' n'a pas de pointeur de retour en amont" + +#: makeinfo/makeinfo.c:5080 +#, c-format +msgid "This node (`%s') is the one with the bad `Prev'" +msgstr "Ce noeud (`%s') est celui dont le champ «Prev» est erroné" + +#: makeinfo/makeinfo.c:5120 +#, fuzzy, c-format +msgid "Node `%s's Prev field not pointed back to" +msgstr "Le champ Prev du noeud `%s' n'a pas de pointeur de retour en amont" + +#: makeinfo/makeinfo.c:5124 +#, fuzzy, c-format +msgid "This node (`%s') has the bad Next" +msgstr "Ce noeud (`%s') est celui dont le champ «Next» est erroné" + +#: makeinfo/makeinfo.c:5136 +#, fuzzy, c-format +msgid "Node `%s' missing Up field" +msgstr "Le noeud `%s' a un champ «Up» manquant" + +#: makeinfo/makeinfo.c:5176 +#, c-format +msgid "`%s' has an Up field of `%s', but `%s' has no menu item for `%s'" +msgstr "" +"Le noeud `%s' a un champ Up de `%s', mais `%s' n'a aucun item menu\n" +"pour `%s'" + +#: makeinfo/makeinfo.c:5207 +#, fuzzy, c-format +msgid "node `%s' has been referenced %d times" +msgstr "Le noeud `%s' a été référencé %d fois" + +#: makeinfo/makeinfo.c:5219 +#, fuzzy, c-format +msgid "unreferenced node `%s'" +msgstr "Noeud `%s' non référencé" + +#: makeinfo/makeinfo.c:5246 +#, fuzzy, c-format +msgid "%s reference to nonexistent node `%s'" +msgstr "Noeud `%s' non référencé" + +#: makeinfo/makeinfo.c:5658 makeinfo/makeinfo.c:5670 +#, fuzzy, c-format +msgid "%cmenu seen before first node" +msgstr "%cmenu apparu avant qu'un noeud n'ait été défini" + +#: makeinfo/makeinfo.c:5659 makeinfo/makeinfo.c:5671 +#, fuzzy +msgid "creating `Top' node" +msgstr "Création du noeud «TOP»." + +#: makeinfo/makeinfo.c:5784 +#, c-format +msgid "`.' or `,' must follow cross reference, not %c" +msgstr "" + +#: makeinfo/makeinfo.c:5952 +#, c-format +msgid "@image file `%s' unreadable: %s" +msgstr "" + +#: makeinfo/makeinfo.c:5956 +#, fuzzy +msgid "@image missing filename argument" +msgstr "%s: absence d'un argument fichier.\n" + +#: makeinfo/makeinfo.c:6057 +#, fuzzy, c-format +msgid "%s requires letter or digit" +msgstr "%s nécessite une lettre ou un chiffre" + +#: makeinfo/makeinfo.c:6142 +#, c-format +msgid "Unmatched `%c%s'" +msgstr "`%c%s' non apparié" + +#: makeinfo/makeinfo.c:6149 +#, c-format +msgid "`%c%s' needs something after it" +msgstr "`%c%s' a besoin de quelque chose après lui" + +#: makeinfo/makeinfo.c:6155 +#, c-format +msgid "Bad argument to `%s', `%s', using `%s'" +msgstr "Mauvais argument à `%s', `%s', utilisant `%s'" + +#: makeinfo/makeinfo.c:6328 +#, c-format +msgid "{No Value For \"%s\"}" +msgstr "" + +#: makeinfo/makeinfo.c:6378 +#, c-format +msgid "%c%s requires a name" +msgstr "%c%s nécessite un nom" + +#: makeinfo/makeinfo.c:6486 +#, c-format +msgid "Reached eof before matching @end %s" +msgstr "" + +#: makeinfo/makeinfo.c:6715 +#, c-format +msgid "The `%c%s' command is meaningless within a `@%s' block" +msgstr "La commande `%c%s' est inactive dans un bloc `@%s'" + +#: makeinfo/makeinfo.c:6724 +#, c-format +msgid "%citemx is not meaningful inside of a `%s' block" +msgstr "%citemx est inactif à l'intérieur d'un bloc `%s'" + +#: makeinfo/makeinfo.c:6837 +#, c-format +msgid "%c%s found outside of an insertion block" +msgstr "%c%s est trouvé à l'extérieur d'un bloc d'insertion" + +#: makeinfo/makeinfo.c:6928 +#, c-format +msgid "Missing `}' in %cdef arg" +msgstr "Accolade «}» manquante dans le paramètre %cdef" + +#: makeinfo/makeinfo.c:7137 makeinfo/makeinfo.c:7157 +msgid "Function" +msgstr "" + +#: makeinfo/makeinfo.c:7141 +msgid "Macro" +msgstr "" + +#: makeinfo/makeinfo.c:7145 +msgid "Special Form" +msgstr "" + +#: makeinfo/makeinfo.c:7149 makeinfo/makeinfo.c:7161 +#, fuzzy +msgid "Variable" +msgstr "Fixer la variable: " + +#: makeinfo/makeinfo.c:7153 +#, fuzzy +msgid "User Option" +msgstr "Insérer la complétion" + +#: makeinfo/makeinfo.c:7165 +#, fuzzy +msgid "Instance Variable" +msgstr "Décrire la variable: " + +#: makeinfo/makeinfo.c:7169 makeinfo/makeinfo.c:7173 +msgid "Method" +msgstr "" + +#: makeinfo/makeinfo.c:7330 +#, c-format +msgid "Must be in a `%s' insertion in order to use `%s'x" +msgstr "Doit être dans une insertion `%s' afin d'utiliser `%s'x." + +#: makeinfo/makeinfo.c:7402 +#, c-format +msgid "%csp requires a positive numeric argument" +msgstr "%csp nécessite un argument numérique positif" + +#: makeinfo/makeinfo.c:7645 +#, fuzzy +msgid "asis" +msgstr "il y a" + +#: makeinfo/makeinfo.c:7647 +#, fuzzy +msgid "none" +msgstr "(vide)" + +#: makeinfo/makeinfo.c:7669 +#, c-format +msgid "Bad argument to %c%s" +msgstr "Mauvais argument à %c%s" + +#: makeinfo/makeinfo.c:7961 +#, fuzzy, c-format +msgid "Unknown index `%s'" +msgstr "Nom d'index inconnu `%s'" + +#: makeinfo/makeinfo.c:8026 +#, c-format +msgid "Index `%s' already exists" +msgstr "L'index `%s' existe toujours" + +#: makeinfo/makeinfo.c:8057 +#, fuzzy, c-format +msgid "Unknown index `%s' and/or `%s' in @synindex" +msgstr "Nom d'index inconnu `%s'" + +#: makeinfo/makeinfo.c:8246 +#, fuzzy, c-format +msgid "Unknown index `%s' in @printindex" +msgstr "Nom d'index inconnu `%s'" + +#: makeinfo/makeinfo.c:8261 +#, fuzzy +msgid "" +"* Menu:\n" +"\n" +msgstr "Menu" + +#: makeinfo/makeinfo.c:8448 +#, c-format +msgid "`%c%s' needs an argument `{...}', not just `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8463 +#, c-format +msgid "No closing brace for footnote `%s'" +msgstr "Aucune accolade fermante «}» pour la note en bas de page `%s'" + +#: makeinfo/makeinfo.c:8502 +msgid "Footnote defined without parent node" +msgstr "La note en bas de page est définie sans noeud parent" + +# Est-ce vraiement un message à traduire? +#: makeinfo/makeinfo.c:8534 +#, fuzzy +msgid "-Footnotes" +msgstr "*Notes en bas de page*" + +# Est-ce vraiment un message à traduire? NON. +#: makeinfo/makeinfo.c:8589 +#, fuzzy +msgid "" +"---------- Footnotes ----------\n" +"\n" +msgstr "" +"---------------------\n" +"\n" + +#: makeinfo/makeinfo.c:8685 +#, fuzzy, c-format +msgid "macro `%s' previously defined" +msgstr "La macro `%s' a déjà été définie précédemment" + +#: makeinfo/makeinfo.c:8689 +#, fuzzy, c-format +msgid "here is the previous definition of `%s'" +msgstr "Ici se trouve la définition précédente de `%s'" + +#: makeinfo/makeinfo.c:8903 +#, c-format +msgid "Macro `%s' called with too many args" +msgstr "La macro `%s' est appelée avec trop d'arguments" + +#: makeinfo/makeinfo.c:9055 +#, c-format +msgid "%cend macro not found" +msgstr "Macro %cend non trouvée" + +#: makeinfo/makeinfo.c:9095 +#, c-format +msgid "%cquote-arg only useful when the macro takes a single argument" +msgstr "%cquote-arg utile seulement lorsque la macro prend un seul argument" + +#: makeinfo/multi.c:206 +#, c-format +msgid "ignoring stray text `%s' after @multitable" +msgstr "abandon du texte orphelin `%s' après la commande @multitable" + +#: makeinfo/multi.c:277 +#, c-format +msgid "Too many columns in multitable item (max %d)" +msgstr "Trop de colonnes dans un item de multitable (%d max)" + +#. impossible, I think. +#: makeinfo/multi.c:304 +msgid "multitable item not in active multitable" +msgstr "item de multitable qui n'est pas dans une multitable active" + +#: makeinfo/multi.c:313 +#, c-format +msgid "Cannot select column #%d in multitable" +msgstr "Ne peut pas sélectionner la colonne #%d dans une multitable." + +#: makeinfo/multi.c:404 +msgid "ignoring @tab outside of multitable" +msgstr "ignorer une commande @tab qui est à l'extérieur d'une multitable" + +#: makeinfo/multi.c:428 +msgid "** Multicolumn output from last row:\n" +msgstr "** Sortie en multicolonnes à partir de la dernière rangée:\n" + +#: makeinfo/multi.c:431 +#, c-format +msgid "* column #%d: output = %s\n" +msgstr "* colonne #%d: sortie = %s\n" + +#: util/install-info.c:119 util/install-info.c:132 +msgid "virtual memory exhausted" +msgstr "mémoire virtuelle épuisée" + +#: util/install-info.c:188 +#, fuzzy, c-format +msgid "%s: warning: " +msgstr "%s: AVERTISSEMENT: " + +#: util/install-info.c:209 +#, c-format +msgid " for %s" +msgstr " pour %s" + +#: util/install-info.c:278 +#, fuzzy, c-format +msgid "\tTry `%s --help' for a complete list of options.\n" +msgstr "Pour avoir la liste complète des options, faites: `%s --help'.\n" + +#: util/install-info.c:286 +#, c-format +msgid "" +"%s [OPTION]... [INFO-FILE [DIR-FILE]]\n" +" Install INFO-FILE in the Info directory file DIR-FILE.\n" +"\n" +"Options:\n" +"--delete Delete existing entries in INFO-FILE;\n" +" don't insert any new entries.\n" +"--dir-file=NAME Specify file name of Info directory file.\n" +" This is equivalent to using the DIR-FILE argument.\n" +"--entry=TEXT Insert TEXT as an Info directory entry.\n" +" TEXT should have the form of an Info menu item line\n" +" plus zero or more extra lines starting with whitespace.\n" +" If you specify more than one entry, they are all added.\n" +" If you don't specify any entries, they are determined\n" +" from information in the Info file itself.\n" +"--help Display this help and exit.\n" +"--info-file=FILE Specify Info file to install in the directory.\n" +" This is equivalent to using the INFO-FILE argument.\n" +"--info-dir=DIR Same as --dir-file=DIR/dir.\n" +"--item=TEXT Same as --entry TEXT.\n" +" An Info directory entry is actually a menu item.\n" +"--quiet Suppress warnings.\n" +"--remove Same as --delete.\n" +"--section=SEC Put this file's entries in section SEC of the directory.\n" +" If you specify more than one section, all the entries\n" +" are added in each of the sections.\n" +" If you don't specify any sections, they are determined\n" +" from information in the Info file itself.\n" +"--version Display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" +"%s [OPTION]... [INFO-FICHIER [DIR-FICHIER]]\n" +" Installer INFO-FICHIER dans le répertoire DIR-FICHIER de fichiers Info.\n" +"\n" +"Options:\n" +"--delete Éliminer les entrées existantes dans INFO-FICHIER;\n" +" ne pas insérer une quelconque nouvelle entrée.\n" +"--dir-file=NOM Spécifier le NOM du répertoire de fichiers Info.\n" +" Ceci équivaut à utiliser l'argument DIR-FICHIER.\n" +"--entry=TEXTE Insérer TEXTE comme une entrée du répertoire Info.\n" +" TEXTE doit avoir la forme d'une ligne d'item de menu\n" +" Info avec zéro ou plusieurs lignes en extra commençant\n" +" par un blanc. Si plus d'une entrée est spécifiée,\n" +" elles seront toutes ajoutées. Si aucune entrée n'est\n" +" spécifiée, elles seront déterminées à partir de\n" +" l'information dans le fichier Info lui-même.\n" +"--help Afficher l'aide-mémoire.\n" +"--info-file=FICHIER Spécifier le FICHIER Info à installer dans le\n" +" répertoire de fichiers Info. Ceci équivaut à utiliser\n" +" l'argument INFO-FICHIER.\n" +"--info-dir=RÉP Identique à l'option --dir-file=RÉP/dir.\n" +"--item=TEXTE Identique à l'option --entry=TEXTE\n" +" Une entrée de répertoire Info est en fait un item menu.\n" +"--quiet Supprimer les avertissements.\n" +"--remove Identique à l'option --delete.\n" +"--section=SEC Mettre cette entrée de fichier dans la section SEC du\n" +" répertoire. Si plus d'une section est spécifiée, " +"toutes\n" +" les entrées sont ajoutées dans chacune des sections. " +"Si\n" +" aucune section n'est spécifiée, elles seront " +"déterminées\n" +" à partir de l'information dans le fichier Info " +"lui-même.\n" +"--version Afficher le nom et la version du logiciel.\n" +"\n" +"Rapporter toute anomalie à bug-texinfo@prep.ai.mit.edu.\n" + +#: util/install-info.c:334 +msgid "" +"This is the file .../info/dir, which contains the\n" +"topmost node of the Info hierarchy, called (dir)Top.\n" +"The first time you invoke Info you start off looking at this node.\n" +"\n" +"File: dir Node: Top This is the top of the INFO tree\n" +"\n" +" This (the Directory node) gives a menu of major topics.\n" +" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n" +" \"h\" gives a primer for first-timers,\n" +" \"mEmacs<Return>\" visits the Emacs manual, etc.\n" +"\n" +" In Emacs, you can click mouse button 2 on a menu item or cross reference\n" +" to select it.\n" +"\n" +"* Menu:\n" +msgstr "" + +#: util/install-info.c:357 +#, c-format +msgid "%s: could not read (%s) and could not create (%s)\n" +msgstr "" + +#: util/install-info.c:456 util/install-info.c:466 +#, c-format +msgid "%s: Specify the Info directory only once.\n" +msgstr "%s: Spécifier le répertoire Info une seule fois seulement.\n" + +#: util/install-info.c:494 +#, c-format +msgid "%s: Specify the Info file only once.\n" +msgstr "%s: Spécifier le fichier Info une seule fois seulement.\n" + +#: util/install-info.c:521 +#, c-format +msgid "install-info (GNU %s) %s\n" +msgstr "" + +#: util/install-info.c:541 +#, c-format +msgid "excess command line argument `%s'" +msgstr "excédent d'argument de ligne de commande `%s'" + +#: util/install-info.c:545 +#, fuzzy +msgid "No input file specified; try --help for more information." +msgstr "Pour en savoir davantage, faites: `%s --help'.\n" + +#: util/install-info.c:547 +#, fuzzy +msgid "No dir file specified; try --help for more information." +msgstr "Pour en savoir davantage, faites: `%s --help'.\n" + +#: util/install-info.c:599 util/install-info.c:622 +msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY" +msgstr "START-INFO-DIR-ENTRY non apparié avec END-INFO-DIR-ENTRY" + +#: util/install-info.c:618 +msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY" +msgstr "END-INFO-DIR-ENTRY non apparié avec START-INFO-DIR-ENTRY" + +#. No need to abort here, the original info file may not have +#. the requisite Texinfo commands. This is not something an +#. installer should have to correct (it's a problem for the +#. maintainer), and there's no need to cause subsequent parts of +#. `make install' to fail. +#: util/install-info.c:632 +#, c-format +msgid "no info dir entry in `%s'" +msgstr "aucune entrée répertoire info dans `%s'" + +#: util/install-info.c:843 +#, c-format +msgid "menu item `%s' already exists, for file `%s'" +msgstr "item menu `%s' déjà existant, pour le fichier `%s'" + +#: util/install-info.c:866 +#, c-format +msgid "no entries found for `%s'; nothing deleted" +msgstr "aucune entrée trouvée pour `%s'; rien n'a été éliminé" + +#: util/texindex.c:263 +msgid "keep temporary files around after processing" +msgstr "conserver les fichiers temporaires après le traitement" + +#: util/texindex.c:265 +msgid "do not keep temporary files around after processing (default)" +msgstr "ne pas conserver les fichiers temporaires après le traitement (défaut)" + +#: util/texindex.c:267 +msgid "send output to FILE" +msgstr "envoyer la sortie dans FICHIER" + +#: util/texindex.c:269 +msgid "display version information and exit" +msgstr "afficher la version en usage" + +#: util/texindex.c:271 +msgid "display this help and exit" +msgstr "afficher l'aide-mémoire" + +#: util/texindex.c:282 +#, c-format +msgid "Usage: %s [OPTION]... FILE...\n" +msgstr "Usage: %s [OPTION]... FICHIER...\n" + +#: util/texindex.c:283 +msgid "Generate a sorted index for each TeX output FILE.\n" +msgstr "Générer un index trié pour chaque FICHIER de sortie TeX.\n" + +#. Avoid trigraph nonsense. +#: util/texindex.c:285 +msgid "Usually FILE... is `foo.??' for a document `foo.texi'.\n" +msgstr "Habituellement FICHIER... est «foo.??» pour un document «foo.texi».\n" + +#: util/texindex.c:286 +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Options:\n" + +#: util/texindex.c:300 +msgid "" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" +"\n" +"Rapporter toute anomalie à bug-texinfo@prep.ai.mit.edu." + +#: util/texindex.c:347 +#, c-format +msgid "texindex (GNU %s %s) 2.1\n" +msgstr "" + +#: util/texindex.c:926 util/texindex.c:960 util/texindex.c:1036 +#: util/texindex.c:1064 +#, c-format +msgid "%s: not a texinfo index file" +msgstr "%s: pas un fichier index en format texinfo" + +#: util/texindex.c:1021 +#, c-format +msgid "failure reopening %s" +msgstr "échec lors de la réouverture de %s" + +#: util/texindex.c:1334 +#, c-format +msgid "entry %s follows an entry with a secondary name" +msgstr "l'entrée %s suit une entrée ayant un nom secondaire" + +#: util/texindex.c:1672 +#, c-format +msgid "%s; for file `%s'.\n" +msgstr "%s; pour le fichier `%s'.\n" + +#: util/texindex.c:1733 +#, c-format +msgid "Virtual memory exhausted in %s ()! Needed %d bytes." +msgstr "Mémoire virtuelle épuisée dans %s ()! Besoin de %d octets." + +#~ msgid "%s: --fill-column arg must be numeric, not `%s'.\n" +#~ msgstr "" +#~ "Le paramètre %s de l'option --fill-column doit être numérique,\n" +#~ "et non pas `%s'.\n" + +#~ msgid "%s: --reference-limit arg must be numeric, not `%s'.\n" +#~ msgstr "" +#~ "Le paramètre %s de l'option --reference-limit doit être numérique,\n" +#~ "et non pas `%s'.\n" + +#~ msgid "Misplaced `}'" +#~ msgstr "Accolade «}» égarée ou mal placée" + +#~ msgid "No input file specified" +#~ msgstr "Aucun fichier d'entrée spécifié" + +#~ msgid "No dir file specified" +#~ msgstr "Aucun fichier répertoire spécifié" + +#~ msgid "stdin" +#~ msgstr "entrée standard «stdin»" + +#~ msgid "GNU Makeinfo (Texinfo 3.9) %d.%d\n" +#~ msgstr "GNU Makeinfo (Texinfo 3.9) %d.%d\n" + +# Est-ce vraiment un message à traduire? +#~ msgid "noname.texi" +#~ msgstr "noname.texi" + +#~ msgid "No node name specified for `%c%s' command" +#~ msgstr "Aucun nom de noeud spécifié pour la commande `%c%s'" + +#~ msgid "" +#~ "Validation error. `%s' field points to node `%s', which doesn't exist" +#~ msgstr "" +#~ "Erreur de validation.\n" +#~ "Le champ `%s' pointe sur le noeud `%s', qui n'existe pas" + +#~ msgid "Cross-reference must be terminated with a period or a comma" +#~ msgstr "La référence croisée doit se terminer par un point ou une virgule" + +#~ msgid "Unknown file system error" +#~ msgstr "Erreur de système de fichiers inconnue" + +#~ msgid "Unknown index reference `%s'" +#~ msgstr "Référence d'index `%s' inconnue" + +#~ msgid "Unknown index reference" +#~ msgstr "Référence d'index inconnue" + +#~ msgid "`%c%s' expected more than just `%s'. It needs something in `{...}'" +#~ msgstr "" +#~ "`%c%s' s'attend à plus que `%s'. Besoin de quelque chose dans «{...}»." + +#~ msgid "Multitables cannot be nested" +#~ msgstr "Les multitables ne peuvent pas être imbriquées" + +#~ msgid "%s: can not open: %s\n" +#~ msgstr "%s: ne peut pas ouvrir: %s\n" + +#~ msgid "%s: %s: %d: mismatched braces\n" +#~ msgstr "%s: %s: %d: accolades non balancées\n" + +#~ msgid "unknown error %d" +#~ msgstr "erreur inconnue %d" + +#~ msgid "Unknown error" +#~ msgstr "Erreur inconnue" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "--keep" +#~ msgstr "--keep" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "-k" +#~ msgstr "-k" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "--no-keep" +#~ msgstr "--no-keep" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "--output" +#~ msgstr "--output" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "-o" +#~ msgstr "-o" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "--version" +#~ msgstr "--version" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "--help" +#~ msgstr "--help" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "-h" +#~ msgstr "-h" + +#~ msgid "Index" +#~ msgstr "Index" + +# Est-ce vraiment un message à traduire? +#~ msgid "*Apropos*" +#~ msgstr "*À-propos*" + +#~ msgid "GNU Info (Texinfo 3.9) %s\n" +#~ msgstr "GNU Info (Texinfo 3.9) %s\n" + +# Est-ce vraiment un commentaire de message à traduire? +#~ msgid "*Info Help*" +#~ msgstr "*Info Aide*" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "******************************" +#~ msgstr "******************************" + +#~ msgid " h Invoke the Info tutorial." +#~ msgstr " h Invoquer le guide de travaux pratiques Info." + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "----------------------" +#~ msgstr "----------------------" + +#~ msgid " n Move to the \"next\" node of this node." +#~ msgstr " n Avancer au noeud «next» de ce noeud." + +#~ msgid " p Move to the \"previous\" node of this node." +#~ msgstr " p Reculer au noeud «previous» de ce noeud." + +#~ msgid " u Move \"up\" from this node." +#~ msgstr " u Monter au noeud «up» à partir de ce noeud." + +#~ msgid " m Pick menu item specified by name." +#~ msgstr " m Choisir l'item «menu» spécifié par le nom." + +#~ msgid " Picking a menu item causes another node to be selected." +#~ msgstr "" +#~ " Choisir un item menu implique qu'un autre noeud est sélectionné." + +#~ msgid " f Follow a cross reference. Reads name of reference." +#~ msgstr "" +#~ " f Suivre une référence croisée («f»ollow). Lire le nom de la référence." + +#~ msgid " l Move to the last node seen in this window." +#~ msgstr " l Aller au dernier noeud affiché dans cette fenêtre («l»ast)." + +#~ msgid " d Move to the `directory' node. Equivalent to `g(DIR)'." +#~ msgstr "" +#~ " d Aller au noeud répertoire («d»irectory). Équivalent à «g(RÉP)»." + +#~ msgid "Moving within a node:" +#~ msgstr "Déplacements dans l'arborescence d'un noeud:" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "---------------------" +#~ msgstr "---------------------" + +#~ msgid " SPC Scroll forward a page." +#~ msgstr " SPC Défiler une page en avançant." + +#~ msgid " DEL Scroll backward a page." +#~ msgstr " DEL Défiler une page en reculant." + +#~ msgid " b Go to the beginning of this node." +#~ msgstr " b Aller au tout début de ce noeud («b»eginning)." + +#~ msgid " e Go to the end of this node." +#~ msgstr " e Aller à la toute fin de ce noeud («e»nd)." + +#~ msgid "\"Advanced\" commands:" +#~ msgstr "Commandes «avancées»:" + +# Est-ce vraiment un message à traduire? +#~ msgid "--------------------" +#~ msgstr "--------------------" + +#~ msgid " q Quit Info." +#~ msgstr " q Quitter le mode Info." + +#~ msgid " 1 Pick first item in node's menu." +#~ msgstr " 1 Choisir le premier item dans le menu de noeuds." + +#~ msgid " 2-9 Pick second ... ninth item in node's menu." +#~ msgstr " 2-9 Choisir le 2ième ... 9ième item dans le menu de noeuds." + +#~ msgid " 0 Pick last item in node's menu." +#~ msgstr " 0 Choisir le dernier item dans le menu de noeuds." + +#~ msgid " g Move to node specified by name." +#~ msgstr " g Aller au noeud spécifié par le nom." + +#~ msgid " You may include a filename as well, as in (FILENAME)NODENAME." +#~ msgstr "" +#~ " Vous pouvez inclure aussi un nom de fichier, comme dans (FICHIER)NOEUD." + +#~ msgid " s Search through this Info file for a specified string," +#~ msgstr " s Fouiller à travers ce fichier Info pour une chaîne spécifiée," + +#~ msgid " and select the node in which the next occurrence is found." +#~ msgstr "" +#~ " et sélectionner le noeud dans lequel la prochaine occurrence est " +#~ "trouvée." + +#~ msgid "The current search path is:\n" +#~ msgstr "Le chemin répertoire de fouille courant est:\n" + +#~ msgid "" +#~ "Commands available in Info windows:\n" +#~ "\n" +#~ msgstr "" +#~ "Commandes disponibles en Info windows:\n" +#~ "\n" + +#~ msgid "" +#~ "Commands available in the echo area:\n" +#~ "\n" +#~ msgstr "" +#~ "Commandes disponibles dans la zone écho:\n" +#~ "\n" + +#~ msgid "Help" +#~ msgstr "Aide" + +#~ msgid "Help-Small-Screen" +#~ msgstr "Petit-Écran-Aide" + +#~ msgid "Info" +#~ msgstr "Info" + +# Est-ce vraiment un message à traduire? NON. +#~ msgid "ESC " +#~ msgstr "ESC " + +#~ msgid "%s (%s): %s." +#~ msgstr "%s (%s): %s." + +# Est-ce vraiment un message à traduire? +#~ msgid "ESC %s" +#~ msgstr "ESC %s" + +# Est-ce vraiment un message à traduire? +#~ msgid "LFD" +#~ msgstr "LFD" + +# Est-ce vraiment un message à traduire? +#~ msgid "TAB" +#~ msgstr "TAB" + +# Est-ce vraiment un message à traduire? +#~ msgid "RET" +#~ msgstr "RET" + +# Est-ce vraiment un message à traduire? +#~ msgid "ESC" +#~ msgstr "ESC" + +# Est-ce vraiment un message à traduire? +#~ msgid "SPC" +#~ msgstr "SPC" + +# Est-ce vraiment un message à traduire? +#~ msgid "DEL" +#~ msgstr "DEL" + +# Est-ce vraiment un message à traduire? +#~ msgid "echo-area-" +#~ msgstr "echo-area-" + +#~ msgid "" +#~ "/* doc.c -- Generated structure containing function names and doc strings." +#~ msgstr "" +#~ "/* doc.c -- Structure générée contenant les noms de fonction et les chaînes " +#~ "doc." + +#~ msgid "" +#~ " This file was automatically made from various source files with the" +#~ msgstr "" +#~ " Ce fichier a été produit automatiquement à partir de fichiers sources\n" +#~ " variés avec la" + +#~ msgid " command \"%s\". DO NOT EDIT THIS FILE, only \"%s.c\"." +#~ msgstr " commande «%s». NE PAS ÉDITER CE FICHIER, seulement «%s.c»." + +#~ msgid " An entry in the array FUNCTION_DOC_ARRAY is made for each command" +#~ msgstr "" +#~ " Une entrée dans le vecteur FUNCTION_DOC_ARRAY est faite pour chaque " +#~ "commande" + +#~ msgid "" +#~ " found in the above files; each entry consists of a function pointer," +#~ msgstr "" +#~ " trouvée dans les fichiers ci-haut; chaque entrée consiste en un pointeur " +#~ "de fonction," + +#~ msgid " a string which is the user-visible name of the function," +#~ msgstr "" +#~ " une chaîne laquelle est le nom visible-à-l'usager de la fonction," + +#~ msgid " and a string which documents its purpose. */" +#~ msgstr " et une chaîne laquelle fournit une documentation de ses buts. */" + +#~ msgid "/* %s -- Generated declarations for Info commands. */\n" +#~ msgstr "/* %s -- Déclarations générées pour les commandes Info. */\n" + +#~ msgid "/* Commands found in \"%s\". */\n" +#~ msgstr "/* Commandes trouvées dans «%s». */\n" + +#~ msgid "" +#~ "\n" +#~ "/* Functions declared in \"%s\". */\n" +#~ msgstr "" +#~ "\n" +#~ "/* Fonctions déclarées dans «%s». */\n" + +# Est-ce vraiment un message à traduire? +#~ msgid "*Node Menu*" +#~ msgstr "*Noeud Menu*" + +#~ msgid "not at all" +#~ msgstr "sans aucune" + +#~ msgid "once" +#~ msgstr "une seule" + +#~ msgid "twice" +#~ msgstr "deux" + +#~ msgid "three" +#~ msgstr "trois" + +#~ msgid "four" +#~ msgstr "quatre" + +#~ msgid "five" +#~ msgstr "cinq" + +#~ msgid "six" +#~ msgstr "six" + +#~ msgid "Continuous" +#~ msgstr "Continu" + +#~ msgid "Next Only" +#~ msgstr "«Next» Seulement" + +#~ msgid "Page Only" +#~ msgstr "Page Seulement" + +#~ msgid "Moving \"Up\" %s, then \"Next\"." +#~ msgstr "Monter vers «Up» %s, puis aller à «Next»." + +#~ msgid "Requested window is not present!" +#~ msgstr "La fenêtre demandée n'est pas présente!" + +#~ msgid "Now wrapped around to beginning of history." +#~ msgstr "" +#~ "Maintenant enroulé autour jusqu'au début de l'histoire des parcours." + +#~ msgid "No earlier nodes in this window." +#~ msgstr "Aucun noeud antérieur dans cette fenêtre." + +# Est-ce vraiment un message à traduire? +#~ msgid "(dir)Top" +#~ msgstr "(dir)Top" + +# Est-ce vraiment un message à traduire? +#~ msgid "~expand: " +#~ msgstr "~expand: " + +#~ msgid "done" +#~ msgstr "terminé" + +#~ msgid "quit" +#~ msgstr "quitter" + +#~ msgid "exit" +#~ msgstr "sortir" + +#~ msgid "readline: Out of virtual memory!\n" +#~ msgstr "lire-ligne: Mémoire virtuelle insuffisante!\n" + +# Est-ce vraiment un commentaire de message à traduire? +#~ msgid "Off" +#~ msgstr "«Off» hors fonction" + +#~ msgid "On" +#~ msgstr "«On» en fonction" + +#~ msgid "All" +#~ msgstr "Toute" + +#~ msgid "Bot" +#~ msgstr "Bas" + +#~ msgid "*no file*" +#~ msgstr "*aucun fichier*" + +#~ msgid "*no node*" +#~ msgstr "*aucun noeud*" + +#~ msgid "Subfile: " +#~ msgstr "Sous-fichier: " + +#~ msgid "%s: Out of virtual memory!\n" +#~ msgstr "%s: Mémoire virtuelle insuffisante!\n" diff --git a/gnu/usr.bin/texinfo/po/stamp-cat-id b/gnu/usr.bin/texinfo/po/stamp-cat-id new file mode 100644 index 00000000000..9788f70238c --- /dev/null +++ b/gnu/usr.bin/texinfo/po/stamp-cat-id @@ -0,0 +1 @@ +timestamp diff --git a/gnu/usr.bin/texinfo/po/texinfo.pot b/gnu/usr.bin/texinfo/po/texinfo.pot new file mode 100644 index 00000000000..503c3bf949d --- /dev/null +++ b/gnu/usr.bin/texinfo/po/texinfo.pot @@ -0,0 +1,1832 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 1997-07-31 17:43-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#. Commands found in "./session.c". +#: info/doc.c:27 info/session.c:629 +msgid "Move down to the next line" +msgstr "" + +#. Move WINDOW's point up to the previous line if possible. +#: info/doc.c:28 info/session.c:644 +msgid "Move up to the previous line" +msgstr "" + +#. Move WINDOW's point to the end of the true line. +#: info/doc.c:29 info/session.c:659 +msgid "Move to the end of the line" +msgstr "" + +#. Move WINDOW's point to the beginning of the true line. +#: info/doc.c:30 info/session.c:679 +msgid "Move to the start of the line" +msgstr "" + +#. Commands found in "./echo-area.c". +#: info/doc.c:31 info/doc.c:84 info/echo-area.c:283 info/session.c:698 +msgid "Move forward a character" +msgstr "" + +#. Move point backward in the node. +#: info/doc.c:32 info/doc.c:85 info/echo-area.c:295 info/session.c:714 +msgid "Move backward a character" +msgstr "" + +#. Move forward a word in the input line. +#: info/doc.c:33 info/doc.c:88 info/echo-area.c:320 info/session.c:732 +msgid "Move forward a word" +msgstr "" + +#: info/doc.c:34 info/doc.c:89 info/echo-area.c:360 info/session.c:781 +msgid "Move backward a word" +msgstr "" + +#: info/doc.c:35 info/session.c:1121 +msgid "Move forwards or down through node structure" +msgstr "" + +#: info/doc.c:36 info/session.c:1137 +msgid "Move backwards or up through node structure" +msgstr "" + +#. Show the next screen of WINDOW's node. +#: info/doc.c:37 info/session.c:1152 +msgid "Scroll forward in this window" +msgstr "" + +#. Show the previous screen of WINDOW's node. +#: info/doc.c:38 info/session.c:1197 +msgid "Scroll backward in this window" +msgstr "" + +#. Move to the beginning of the node. +#: info/doc.c:39 info/session.c:1237 +msgid "Move to the start of this node" +msgstr "" + +#. Move to the end of the node. +#: info/doc.c:40 info/session.c:1244 +msgid "Move to the end of this node" +msgstr "" + +#. **************************************************************** +#. +#. Commands for Manipulating Windows +#. +#. **************************************************************** +#. Make the next window in the chain be the active window. +#: info/doc.c:41 info/session.c:1257 +msgid "Select the next window" +msgstr "" + +#. Make the previous window in the chain be the active window. +#: info/doc.c:42 info/session.c:1296 +msgid "Select the previous window" +msgstr "" + +#. Split WINDOW into two windows, both showing the same node. If we +#. are automatically tiling windows, re-tile after the split. +#: info/doc.c:43 info/session.c:1347 +msgid "Split the current window" +msgstr "" + +#. Delete WINDOW, forgetting the list of last visited nodes. If we are +#. automatically displaying footnotes, show or remove the footnotes +#. window. If we are automatically tiling windows, re-tile after the +#. deletion. +#: info/doc.c:44 info/session.c:1428 +msgid "Delete the current window" +msgstr "" + +#. Just keep WINDOW, deleting all others. +#: info/doc.c:45 info/session.c:1469 +msgid "Delete all other windows" +msgstr "" + +#. Scroll the "other" window of WINDOW. +#: info/doc.c:46 info/session.c:1515 +msgid "Scroll the other window" +msgstr "" + +#. Change the size of WINDOW by AMOUNT. +#: info/doc.c:47 info/session.c:1535 +msgid "Grow (or shrink) this window" +msgstr "" + +#: info/doc.c:48 info/session.c:1546 +msgid "Divide the available screen space among the visible windows" +msgstr "" + +#: info/doc.c:49 info/session.c:1553 +msgid "Toggle the state of line wrapping in the current window" +msgstr "" + +#. Make WINDOW display the "Next:" node of the node currently being +#. displayed. +#: info/doc.c:50 info/session.c:1714 +msgid "Select the `Next' node" +msgstr "" + +#. Make WINDOW display the "Prev:" node of the node currently being +#. displayed. +#: info/doc.c:51 info/session.c:1722 +msgid "Select the `Prev' node" +msgstr "" + +#. Make WINDOW display the "Up:" node of the node currently being +#. displayed. +#: info/doc.c:52 info/session.c:1730 +msgid "Select the `Up' node" +msgstr "" + +#. Make WINDOW display the last node of this info file. +#: info/doc.c:53 info/session.c:1737 +msgid "Select the last node in this file" +msgstr "" + +#. Make WINDOW display the first node of this info file. +#: info/doc.c:54 info/session.c:1759 +msgid "Select the first node in this file" +msgstr "" + +#: info/doc.c:55 info/session.c:2401 +msgid "Select the most recently selected node" +msgstr "" + +#: info/doc.c:56 info/session.c:1778 +msgid "Select the last item in this node's menu" +msgstr "" + +#. Use KEY (a digit) to select the Nth menu item in WINDOW->node. +#: info/doc.c:57 info/session.c:1784 +msgid "Select this menu item" +msgstr "" + +#. Read a line (with completion) which is the name of a menu item, +#. and select that item. +#: info/doc.c:58 info/session.c:2042 +msgid "Read a menu item and select its node" +msgstr "" + +#: info/doc.c:59 info/session.c:2050 +msgid "Read a footnote or cross reference and select its node" +msgstr "" + +#. Position the cursor at the start of this node's menu. +#: info/doc.c:60 info/session.c:2056 +msgid "Move to the start of this node's menu" +msgstr "" + +#: info/doc.c:61 info/session.c:2080 +msgid "Visit as many menu items at once as possible" +msgstr "" + +#. Read a line of input which is a node name, and go to that node. +#: info/doc.c:62 info/session.c:2108 +msgid "Read a node name and select it" +msgstr "" + +#: info/doc.c:63 info/session.c:2194 +msgid "Read a manpage reference and select it" +msgstr "" + +#. Move to the "Top" node in this file. +#: info/doc.c:64 info/session.c:2228 +msgid "Select the node `Top' in this file" +msgstr "" + +#. Move to the node "(dir)Top". +#: info/doc.c:65 info/session.c:2234 +msgid "Select the node `(dir)'" +msgstr "" + +#. Kill named node. +#: info/doc.c:66 info/session.c:2407 +msgid "Kill this node" +msgstr "" + +#. Read the name of a file and select the entire file. +#: info/doc.c:67 info/session.c:2415 +msgid "Read the name of a file and select it" +msgstr "" + +#: info/doc.c:68 info/session.c:2634 +msgid "Pipe the contents of this node through INFO_PRINT_COMMAND" +msgstr "" + +#: info/doc.c:69 info/session.c:2946 +msgid "Read a string and search for it" +msgstr "" + +#: info/doc.c:70 info/doc.c:71 info/session.c:3020 info/session.c:3026 +msgid "Search interactively for a string as you type it" +msgstr "" + +#: info/doc.c:72 info/session.c:3579 +msgid "Move to the previous cross reference" +msgstr "" + +#: info/doc.c:73 info/session.c:3588 +msgid "Move to the next cross reference" +msgstr "" + +#: info/doc.c:74 info/session.c:3598 +msgid "Select reference or menu item appearing on this line" +msgstr "" + +#. **************************************************************** +#. +#. Miscellaneous Info Commands +#. +#. **************************************************************** +#. What to do when C-g is pressed in a window. +#: info/doc.c:75 info/session.c:3620 +msgid "Cancel current operation" +msgstr "" + +#: info/doc.c:76 info/session.c:3636 +msgid "Move to the cursor to a specific line of the window" +msgstr "" + +#. Clear the screen and redraw its contents. Given a numeric argument, +#. move the line the cursor is on to the COUNT'th line of the window. +#: info/doc.c:77 info/session.c:3668 +msgid "Redraw the display" +msgstr "" + +#. This command does nothing. It is the fact that a key is bound to it +#. that has meaning. See the code at the top of info_session (). +#: info/doc.c:78 info/session.c:3705 +msgid "Quit using Info" +msgstr "" + +#: info/doc.c:80 info/session.c:3958 +msgid "Add this digit to the current numeric argument" +msgstr "" + +#: info/doc.c:81 +msgid "universal-argument" +msgstr "" + +#: info/doc.c:81 info/session.c:3967 +msgid "Start (or multiply by 4) the current numeric argument" +msgstr "" + +#: info/doc.c:82 info/session.c:3982 +msgid "Internally used by \\[universal-argument]" +msgstr "" + +#: info/doc.c:86 info/echo-area.c:307 +msgid "Move to the start of this line" +msgstr "" + +#: info/doc.c:87 info/echo-area.c:312 +msgid "Move to the end of this line" +msgstr "" + +#: info/doc.c:90 info/echo-area.c:400 +msgid "Delete the character under the cursor" +msgstr "" + +#: info/doc.c:91 info/echo-area.c:430 +msgid "Delete the character behind the cursor" +msgstr "" + +#: info/doc.c:92 info/echo-area.c:451 +msgid "Cancel or quit operation" +msgstr "" + +#: info/doc.c:93 info/echo-area.c:466 +msgid "Accept (or force completion of) this line" +msgstr "" + +#: info/doc.c:94 info/echo-area.c:471 +msgid "Insert next character verbatim" +msgstr "" + +#: info/doc.c:95 info/echo-area.c:479 +msgid "Insert this character" +msgstr "" + +#: info/doc.c:96 info/echo-area.c:497 +msgid "Insert a TAB character" +msgstr "" + +#. Transpose the characters at point. If point is at the end of the line, +#. then transpose the characters before point. +#: info/doc.c:97 info/echo-area.c:504 +msgid "Transpose characters at point" +msgstr "" + +#: info/doc.c:98 info/echo-area.c:555 +msgid "Yank back the contents of the last kill" +msgstr "" + +#. If the last command was yank, or yank_pop, and the text just before +#. point is identical to the current kill item, then delete that text +#. from the line, rotate the index down, and yank back some other text. +#: info/doc.c:99 info/echo-area.c:575 +msgid "Yank back a previous kill" +msgstr "" + +#. Delete the text from point to end of line. +#: info/doc.c:100 info/echo-area.c:608 +msgid "Kill to the end of the line" +msgstr "" + +#: info/doc.c:101 info/echo-area.c:621 +msgid "Kill to the beginning of the line" +msgstr "" + +#. Delete from point to the end of the current word. +#: info/doc.c:102 info/echo-area.c:633 +msgid "Kill the word following the cursor" +msgstr "" + +#: info/doc.c:103 info/echo-area.c:652 +msgid "Kill the word preceding the cursor" +msgstr "" + +#: info/doc.c:104 info/echo-area.c:916 +msgid "List possible completions" +msgstr "" + +#: info/doc.c:105 info/echo-area.c:1090 +msgid "Insert completion" +msgstr "" + +#. Scroll the "other" window. If there is a window showing completions, scroll +#. that one, otherwise scroll the window which was active on entering the read +#. function. +#: info/doc.c:106 info/echo-area.c:1321 +msgid "Scroll the completions window" +msgstr "" + +#. Commands found in "./infodoc.c". +#: info/doc.c:108 info/infodoc.c:328 +msgid "Display help message" +msgstr "" + +#. Show the Info help node. This means that the "info" file is installed +#. where it can easily be found on your system. +#: info/doc.c:109 info/infodoc.c:346 +msgid "Visit Info node `(info)Help'" +msgstr "" + +#: info/doc.c:110 info/infodoc.c:470 +msgid "Print documentation for KEY" +msgstr "" + +#: info/doc.c:111 +msgid "Show what to type to execute a given command" +msgstr "" + +#. Commands found in "./m-x.c". +#: info/doc.c:113 info/m-x.c:69 +msgid "Read the name of an Info command and describe it" +msgstr "" + +#: info/doc.c:114 info/m-x.c:96 +msgid "Read a command name in the echo area and execute it" +msgstr "" + +#: info/doc.c:115 info/m-x.c:150 +msgid "Set the height of the displayed window" +msgstr "" + +#. Commands found in "./indices.c". +#: info/doc.c:117 info/indices.c:175 +msgid "Look up a string in the index for this file" +msgstr "" + +#: info/doc.c:118 info/indices.c:332 +msgid "" +"Go to the next matching index item from the last `\\[index-search]' command" +msgstr "" + +#: info/doc.c:119 info/indices.c:616 +msgid "Grovel all known info file's indices for a string and build a menu" +msgstr "" + +#. Commands found in "./nodemenu.c". +#: info/doc.c:121 info/nodemenu.c:217 +msgid "Make a window containing a menu of all of the currently visited nodes" +msgstr "" + +#: info/doc.c:122 info/nodemenu.c:297 +msgid "Select a node which has been previously visited in a visible window" +msgstr "" + +#. Commands found in "./footnotes.c". +#: info/doc.c:124 info/footnotes.c:232 +msgid "Show the footnotes associated with this node in another window" +msgstr "" + +#. Commands found in "./variables.c". +#: info/doc.c:126 info/variables.c:77 +msgid "Explain the use of a variable" +msgstr "" + +#: info/doc.c:127 info/variables.c:102 +msgid "Set the value of an Info variable" +msgstr "" + +#: info/echo-area.c:562 +msgid "Kill ring is empty" +msgstr "" + +#: info/echo-area.c:871 +msgid "Not complete" +msgstr "" + +#: info/echo-area.c:929 +msgid "No completions" +msgstr "" + +#: info/echo-area.c:933 +msgid "Sole completion" +msgstr "" + +#: info/echo-area.c:942 +#, c-format +msgid "There %s %d " +msgstr "" + +#: info/echo-area.c:942 +msgid "is" +msgstr "" + +#: info/echo-area.c:942 +msgid "are" +msgstr "" + +#: info/echo-area.c:945 +#, c-format +msgid "completion%s:\n" +msgstr "" + +#: info/echo-area.c:1223 +msgid "Building completions..." +msgstr "" + +#: info/footnotes.c:206 +msgid "Footnotes could not be displayed" +msgstr "" + +#: info/indices.c:205 +msgid "Finding index entries..." +msgstr "" + +#: info/indices.c:212 +msgid "No indices found." +msgstr "" + +#: info/indices.c:222 +msgid "Index entry: " +msgstr "" + +#: info/indices.c:342 +msgid "No previous index search string." +msgstr "" + +#: info/indices.c:349 +msgid "No index entries." +msgstr "" + +#: info/indices.c:382 +#, c-format +msgid "No %sindex entries containing \"%s\"." +msgstr "" + +#: info/indices.c:383 +msgid "more " +msgstr "" + +#: info/indices.c:393 +msgid "CAN'T SEE THIS" +msgstr "" + +#: info/indices.c:429 +#, c-format +msgid "Found \"%s\" in %s. (`\\[next-index-match]' tries to find next.)" +msgstr "" + +#: info/indices.c:533 +#, c-format +msgid "Scanning indices of \"%s\"..." +msgstr "" + +#: info/indices.c:620 +msgid "Index apropos: " +msgstr "" + +#: info/indices.c:650 +#, c-format +msgid "" +"\n" +"* Menu: Nodes whoses indices contain \"%s\":\n" +msgstr "" + +#: info/info.c:347 +msgid "no entries found\n" +msgstr "" + +#: info/info.c:390 +msgid "There is no menu in this node." +msgstr "" + +#: info/info.c:421 +#, c-format +msgid "There is no menu item \"%s\" in this node." +msgstr "" + +#: info/info.c:485 +#, c-format +msgid "Unable to find the node referenced by \"%s\"." +msgstr "" + +#: info/info.c:595 +msgid "" +"Usage: info [-d dir-path] [-f info-file] [-o output-file] [-n node-name]..." +msgstr "" + +#: info/info.c:596 +msgid "" +" [--directory dir-path] [--file info-file] [--node node-name]..." +msgstr "" + +#: info/info.c:597 +msgid " [--help] [--output output-file] [--subnodes] [--version]" +msgstr "" + +#: info/info.c:598 +msgid " [--dribble dribble-file] [--restore from-file]" +msgstr "" + +#: info/info.c:599 +msgid " [menu-selection ...]" +msgstr "" + +#: info/info.c:607 +msgid "" +"Here is a quick description of Info's options. For a more complete\n" +"description of how to use Info, type `info info options'.\n" +"\n" +" --directory DIR Add DIR to INFOPATH.\n" +" --dribble FILENAME Remember user keystrokes in FILENAME.\n" +" --file FILENAME Specify Info file to visit.\n" +" --node NODENAME Specify nodes in first visited Info file.\n" +" --output FILENAME Output selected nodes to FILENAME.\n" +" --restore FILENAME Read initial keystrokes from FILENAME.\n" +" --subnodes Recursively output menu items.\n" +" --help Get this help message.\n" +" --version Display Info's version information.\n" +"\n" +"Remaining arguments to Info are treated as the names of menu\n" +"items in the initial node visited. You can easily move to the\n" +"node of your choice by specifying the menu names which describe\n" +"the path to that node. For example, `info emacs buffers'.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" + +#: info/infodoc.c:50 +msgid "Basic Commands in Info Windows" +msgstr "" + +#: info/infodoc.c:211 +msgid "" +"The following commands can only be invoked via M-x:\n" +"\n" +msgstr "" + +#: info/infodoc.c:228 +msgid "--- Use `\\[history-node]' or `\\[kill-node]' to exit ---\n" +msgstr "" + +#: info/infodoc.c:483 +#, c-format +msgid "Describe key: %s" +msgstr "" + +#: info/infodoc.c:492 +#, c-format +msgid "ESC %s is undefined." +msgstr "" + +#: info/infodoc.c:509 +#, c-format +msgid "%s is undefined." +msgstr "" + +#: info/infodoc.c:535 +#, c-format +msgid "%s is defined to %s." +msgstr "" + +#: info/infodoc.c:731 +msgid "Where is command: " +msgstr "" + +#: info/infodoc.c:753 +#, c-format +msgid "`%s' is not on any keys" +msgstr "" + +#: info/infodoc.c:759 +#, c-format +msgid "%s can only be invoked via %s." +msgstr "" + +#: info/infodoc.c:762 +#, c-format +msgid "%s can be invoked via %s." +msgstr "" + +#: info/infodoc.c:766 +#, c-format +msgid "There is no function named `%s'" +msgstr "" + +#: info/m-x.c:73 +msgid "Describe command: " +msgstr "" + +#: info/m-x.c:134 +msgid "Cannot execute an `echo-area' command here." +msgstr "" + +#: info/m-x.c:163 +#, c-format +msgid "Set screen height to (%d): " +msgstr "" + +#: info/makedoc.c:126 +msgid "" +" Source files groveled to make this file include:\n" +"\n" +msgstr "" + +#: info/makedoc.c:450 +#, c-format +msgid "Couldn't manipulate the file %s.\n" +msgstr "" + +#: info/nodemenu.c:28 +msgid "" +"\n" +"* Menu:\n" +" (File)Node Lines Size Containing File\n" +" ---------- ----- ---- ---------------" +msgstr "" + +#: info/nodemenu.c:197 +msgid "" +"Here is the menu of nodes you have recently visited.\n" +"Select one from this menu, or use `\\[history-node]' in another window.\n" +msgstr "" + +#: info/nodemenu.c:309 +msgid "Select visited node: " +msgstr "" + +#: info/nodemenu.c:329 info/session.c:1996 +#, c-format +msgid "The reference disappeared! (%s)." +msgstr "" + +#: info/session.c:162 +#, c-format +msgid "" +"Welcome to Info version %s. \"\\[get-help-window]\" for help, " +"\"\\[menu-item]\" for menu item." +msgstr "" + +#: info/session.c:855 +msgid " times" +msgstr "" + +#: info/session.c:857 +#, c-format +msgid "%d times" +msgstr "" + +#: info/session.c:895 +msgid "No \"Next\" pointer for this node." +msgstr "" + +#: info/session.c:898 +msgid "Following \"Next\" node..." +msgstr "" + +#: info/session.c:899 info/session.c:927 info/session.c:999 +#: info/session.c:1717 +msgid "Next" +msgstr "" + +#: info/session.c:915 +msgid "Selecting first menu item..." +msgstr "" + +#: info/session.c:926 +msgid "Selecting \"Next\" node..." +msgstr "" + +#: info/session.c:950 info/session.c:1063 info/session.c:1733 +msgid "Up" +msgstr "" + +#: info/session.c:1020 +msgid "No more nodes." +msgstr "" + +#: info/session.c:1044 +msgid "No \"Prev\" for this node." +msgstr "" + +#. Move to the previous node. If this node now contains a menu, +#. and we have not inhibited movement to it, move to the node +#. corresponding to the last menu item. +#: info/session.c:1047 info/session.c:1100 +msgid "Moving \"Prev\" in this window." +msgstr "" + +#: info/session.c:1048 info/session.c:1101 info/session.c:1725 +msgid "Prev" +msgstr "" + +#: info/session.c:1059 +msgid "No \"Prev\" or \"Up\" for this node." +msgstr "" + +#: info/session.c:1062 +msgid "Moving \"Up\" in this window." +msgstr "" + +#: info/session.c:1110 +msgid "Moving to \"Prev\"'s last menu item." +msgstr "" + +#: info/session.c:1436 +msgid "Cannot delete a permanent window" +msgstr "" + +#: info/session.c:1750 info/session.c:1768 +msgid "This window has no additional nodes" +msgstr "" + +#: info/session.c:1813 +#, c-format +msgid "There aren't %d items in this menu." +msgstr "" + +#: info/session.c:1944 +#, c-format +msgid "Menu item (%s): " +msgstr "" + +#: info/session.c:1946 +msgid "Menu item: " +msgstr "" + +#: info/session.c:1951 +#, c-format +msgid "Follow xref (%s): " +msgstr "" + +#: info/session.c:1953 +msgid "Follow xref: " +msgstr "" + +#: info/session.c:2169 info/session.c:2173 +msgid "Goto Node: " +msgstr "" + +#: info/session.c:2198 +msgid "Get Manpage: " +msgstr "" + +#. Notice that the node "Top" is special, and doesn't have to +#. be referenced. +#: info/session.c:2230 makeinfo/makeinfo.c:5135 makeinfo/makeinfo.c:5218 +msgid "Top" +msgstr "" + +#: info/session.c:2254 +#, c-format +msgid "Kill node (%s): " +msgstr "" + +#: info/session.c:2307 +#, c-format +msgid "Cannot kill node `%s'" +msgstr "" + +#: info/session.c:2317 +msgid "Cannot kill the last node" +msgstr "" + +#: info/session.c:2419 +msgid "Find file: " +msgstr "" + +#: info/session.c:2436 +#, c-format +msgid "Cannot find \"%s\"." +msgstr "" + +#: info/session.c:2483 info/session.c:2608 +#, c-format +msgid "Could not create output file \"%s\"." +msgstr "" + +#: info/session.c:2496 info/session.c:2625 info/session.c:2671 +msgid "Done." +msgstr "" + +#: info/session.c:2553 +#, c-format +msgid "Writing node \"(%s)%s\"..." +msgstr "" + +#: info/session.c:2556 +#, c-format +msgid "Writing node \"%s\"..." +msgstr "" + +#: info/session.c:2654 +#, c-format +msgid "Cannot open pipe to \"%s\"." +msgstr "" + +#: info/session.c:2661 +#, c-format +msgid "Printing node \"(%s)%s\"..." +msgstr "" + +#: info/session.c:2664 +#, c-format +msgid "Printing node \"%s\"..." +msgstr "" + +#: info/session.c:2896 +#, c-format +msgid "Searching subfile \"%s\"..." +msgstr "" + +#: info/session.c:2966 +#, c-format +msgid "%s for string [%s]: " +msgstr "" + +#: info/session.c:2967 +msgid "Search backward" +msgstr "" + +#: info/session.c:2967 +msgid "Search" +msgstr "" + +#: info/session.c:2994 +msgid "Search failed." +msgstr "" + +#: info/session.c:3120 +msgid "I-search backward: " +msgstr "" + +#: info/session.c:3122 +msgid "I-search: " +msgstr "" + +#: info/session.c:3147 +msgid "Failing " +msgstr "" + +#: info/session.c:3512 +msgid "No cross references in this node." +msgstr "" + +#: info/session.c:3627 +msgid "Quit" +msgstr "" + +#: info/session.c:3728 +#, c-format +msgid "Unknown command (%s)." +msgstr "" + +#: info/session.c:3733 +msgid "\"\" is invalid" +msgstr "" + +#: info/session.c:3735 +#, c-format +msgid "\"%s\" is invalid" +msgstr "" + +#: info/variables.c:40 +msgid "When \"On\", footnotes appear and disappear automatically" +msgstr "" + +#: info/variables.c:44 +msgid "When \"On\", creating or deleting a window resizes other windows" +msgstr "" + +#: info/variables.c:48 +msgid "When \"On\", flash the screen instead of ringing the bell" +msgstr "" + +#: info/variables.c:52 +msgid "When \"On\", errors cause the bell to ring" +msgstr "" + +#: info/variables.c:56 +msgid "When \"On\", Info garbage collects files which had to be uncompressed" +msgstr "" + +#: info/variables.c:59 +msgid "When \"On\", the portion of the matched search string is highlighted" +msgstr "" + +#: info/variables.c:63 +msgid "Controls what happens when scrolling is requested at the end of a node" +msgstr "" + +#: info/variables.c:67 +msgid "The number lines to scroll when the cursor moves out of the window" +msgstr "" + +#: info/variables.c:71 +msgid "When \"On\", Info accepts and displays ISO Latin characters" +msgstr "" + +#. Get the variable's name. +#: info/variables.c:83 +msgid "Describe variable: " +msgstr "" + +#. Get the variable's name and value. +#: info/variables.c:108 +msgid "Set variable: " +msgstr "" + +#: info/variables.c:126 +#, c-format +msgid "Set %s to value (%d): " +msgstr "" + +#: info/variables.c:167 +#, c-format +msgid "Set %s to value (%s): " +msgstr "" + +#: info/window.c:1102 +msgid "--*** Tags out of Date ***" +msgstr "" + +#. strlen (location_indicator). +#. 10 for the decimal representation of the number of lines in this +#. node, and the remainder of the text that can appear in the line. +#: info/window.c:1113 +msgid "-----Info: (), lines ----, " +msgstr "" + +#: info/window.c:1120 +#, c-format +msgid "-%s---Info: %s, %d lines --%s--" +msgstr "" + +#: info/window.c:1124 +#, c-format +msgid "-%s%s-Info: (%s)%s, %d lines --%s--" +msgstr "" + +#: info/window.c:1131 +#, c-format +msgid " Subfile: %s" +msgstr "" + +#: makeinfo/makeinfo.c:889 +#, c-format +msgid "%s:%d: warning: " +msgstr "" + +#: makeinfo/makeinfo.c:912 +msgid "Too many errors! Gave up.\n" +msgstr "" + +#: makeinfo/makeinfo.c:971 makeinfo/makeinfo.c:996 makeinfo/makeinfo.c:1064 +#, c-format +msgid "%s: %s arg must be numeric, not `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:985 +#, c-format +msgid "Couldn't open macro expansion output `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:988 +msgid "Cannot specify more than one macro expansion output" +msgstr "" + +#: makeinfo/makeinfo.c:1032 +#, c-format +msgid "%s: --paragraph-indent arg must be numeric/`none'/`asis', not `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:1075 +#, c-format +msgid "%s: --footnote-style arg must be `separate' or `end', not `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:1085 util/install-info.c:522 util/texindex.c:348 +msgid "" +"Copyright (C) 1996 Free Software Foundation, Inc.\n" +"There is NO warranty. You may redistribute this software\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the files named COPYING." +msgstr "" + +#: makeinfo/makeinfo.c:1105 +#, c-format +msgid "%s: missing file argument.\n" +msgstr "" + +#: makeinfo/makeinfo.c:1146 +#, c-format +msgid "makeinfo (GNU %s %s) %d.%d\n" +msgstr "" + +#: makeinfo/makeinfo.c:1158 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "" + +#: makeinfo/makeinfo.c:1160 +#, c-format +msgid "" +"Usage: %s [OPTION]... TEXINFO-FILE...\n" +"\n" +"Translate Texinfo source documentation to a format suitable for reading\n" +"with GNU Info.\n" +"\n" +"Options:\n" +"-D VAR define a variable, as with @set.\n" +"-E MACRO-OFILE process macros only, output texinfo source.\n" +"-I DIR append DIR to the @include directory search path.\n" +"-P DIR prepend DIR to the @include directory search path.\n" +"-U VAR undefine a variable, as with @clear.\n" +"--error-limit NUM quit after NUM errors (default %d).\n" +"--fill-column NUM break lines at NUM characters (default %d).\n" +"--footnote-style STYLE output footnotes according to STYLE:\n" +" `separate' to place footnotes in their own node,\n" +" `end' to place the footnotes at the end of\n" +" the node in which they are defined (the default).\n" +"--force preserve output even if errors.\n" +"--help display this help and exit.\n" +"--no-validate suppress node cross-reference validation.\n" +"--no-warn suppress warnings (but not errors).\n" +"--no-split suppress splitting of large files.\n" +"--no-headers suppress node separators and Node: Foo headers.\n" +"--output FILE, -o FILE output to FILE, and ignore any @setfilename.\n" +"--paragraph-indent VAL indent paragraphs with VAL spaces (default %d).\n" +" if VAL is `none', do not indent; if VAL is `asis',\n" +" preserve any existing indentation.\n" +"--reference-limit NUM complain about at most NUM references (default %d).\n" +"--verbose report about what is being done.\n" +"--version display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" + +#: makeinfo/makeinfo.c:1545 +#, c-format +msgid "%s: getwd: %s, %s\n" +msgstr "" + +#: makeinfo/makeinfo.c:1741 +#, c-format +msgid "Expected `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2072 +#, c-format +msgid "No `%s' found in `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2122 +#, c-format +msgid "%s: Skipping macro expansion to stdout as Info output is going there.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2141 +#, c-format +msgid "Making %s file `%s' from `%s'.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2171 +#, c-format +msgid "This is Info file %s, produced by Makeinfo version %d.%d" +msgstr "" + +#: makeinfo/makeinfo.c:2173 +#, c-format +msgid " from the input file %s.\n" +msgstr "" + +#: makeinfo/makeinfo.c:2192 +#, c-format +msgid "" +"%s: Removing macro output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. If there were errors, and no --force, remove the output. +#: makeinfo/makeinfo.c:2224 +#, c-format +msgid "%s: Removing output file `%s' due to errors; use --force to preserve.\n" +msgstr "" + +#. Special case. I'm not supposed to see this character by itself. +#. If I do, it means there is a syntax error in the input text. +#. Report the error here, but remember this brace on the stack so +#. you can ignore its partner. +#: makeinfo/makeinfo.c:2364 makeinfo/makeinfo.c:7624 +#, c-format +msgid "Misplaced %c" +msgstr "" + +#: makeinfo/makeinfo.c:2451 +#, c-format +msgid "Unknown command `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:2471 +msgid "NO_NAME!" +msgstr "" + +#: makeinfo/makeinfo.c:2485 +#, c-format +msgid "%c%s expected `{...}'" +msgstr "" + +#: makeinfo/makeinfo.c:2518 +msgid "Unmatched }" +msgstr "" + +#: makeinfo/makeinfo.c:2566 +#, c-format +msgid "%c%s missing close brace" +msgstr "" + +#: makeinfo/makeinfo.c:3362 +msgid "Broken-Type in insertion_type_pname" +msgstr "" + +#: makeinfo/makeinfo.c:3428 +msgid "Enumeration stack overflow" +msgstr "" + +#: makeinfo/makeinfo.c:3460 +#, c-format +msgid "lettering overflow, restarting at %c" +msgstr "" + +#: makeinfo/makeinfo.c:3499 +msgid "* Menu:\n" +msgstr "" + +#: makeinfo/makeinfo.c:3583 +#, c-format +msgid "%s requires an argument: the formatter for %citem" +msgstr "" + +#: makeinfo/makeinfo.c:3687 +#, c-format +msgid "`%cend' expected `%s', but saw `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:3800 +#, c-format +msgid "No matching `%cend %s'" +msgstr "" + +#: makeinfo/makeinfo.c:3939 +#, c-format +msgid "How did @%s end up in cm_special_char?\n" +msgstr "" + +#. This error message isn't perfect if the argument is multiple +#. characters, but it doesn't seem worth getting right. +#: makeinfo/makeinfo.c:3953 +#, c-format +msgid "%c%s expects `i' or `j' as argument, not `%c'" +msgstr "" + +#: makeinfo/makeinfo.c:3957 +#, c-format +msgid "%c%s expects a single character `i' or `j' as argument" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "January" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "February" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "March" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "April" +msgstr "" + +#: makeinfo/makeinfo.c:3969 +msgid "May" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "June" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "July" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "August" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "September" +msgstr "" + +#: makeinfo/makeinfo.c:3970 +msgid "October" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "November" +msgstr "" + +#: makeinfo/makeinfo.c:3971 +msgid "December" +msgstr "" + +#: makeinfo/makeinfo.c:3976 +#, c-format +msgid "%d %s %d" +msgstr "" + +#: makeinfo/makeinfo.c:4029 +#, c-format +msgid "%c%s expects a single character as an argument" +msgstr "" + +#: makeinfo/makeinfo.c:4143 +#, c-format +msgid "%c%s is obsolete" +msgstr "" + +#: makeinfo/makeinfo.c:4315 +#, c-format +msgid "There already is a node having %ctop as a section" +msgstr "" + +#: makeinfo/makeinfo.c:4327 +#, c-format +msgid "Here is the %ctop node" +msgstr "" + +#: makeinfo/makeinfo.c:4346 +#, c-format +msgid "%ctop used before %cnode, defaulting to %s" +msgstr "" + +#: makeinfo/makeinfo.c:4421 +#, c-format +msgid "%c%s is obsolete; use %c%s instead" +msgstr "" + +#: makeinfo/makeinfo.c:4670 +#, c-format +msgid "Node `%s' multiply defined (line %d is first definition at)" +msgstr "" + +#: makeinfo/makeinfo.c:4743 +#, c-format +msgid "Formatting node %s...\n" +msgstr "" + +#: makeinfo/makeinfo.c:4792 +#, c-format +msgid "Node `%s' requires a sectioning command (e.g. %c%s)" +msgstr "" + +#: makeinfo/makeinfo.c:5075 +#, c-format +msgid "Node `%s''s Next field not pointed back to" +msgstr "" + +#: makeinfo/makeinfo.c:5080 +#, c-format +msgid "This node (`%s') is the one with the bad `Prev'" +msgstr "" + +#: makeinfo/makeinfo.c:5120 +#, c-format +msgid "Node `%s's Prev field not pointed back to" +msgstr "" + +#: makeinfo/makeinfo.c:5124 +#, c-format +msgid "This node (`%s') has the bad Next" +msgstr "" + +#: makeinfo/makeinfo.c:5136 +#, c-format +msgid "Node `%s' missing Up field" +msgstr "" + +#: makeinfo/makeinfo.c:5176 +#, c-format +msgid "`%s' has an Up field of `%s', but `%s' has no menu item for `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:5207 +#, c-format +msgid "node `%s' has been referenced %d times" +msgstr "" + +#: makeinfo/makeinfo.c:5219 +#, c-format +msgid "unreferenced node `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:5246 +#, c-format +msgid "%s reference to nonexistent node `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:5658 makeinfo/makeinfo.c:5670 +#, c-format +msgid "%cmenu seen before first node" +msgstr "" + +#: makeinfo/makeinfo.c:5659 makeinfo/makeinfo.c:5671 +msgid "creating `Top' node" +msgstr "" + +#: makeinfo/makeinfo.c:5784 +#, c-format +msgid "`.' or `,' must follow cross reference, not %c" +msgstr "" + +#: makeinfo/makeinfo.c:5952 +#, c-format +msgid "@image file `%s' unreadable: %s" +msgstr "" + +#: makeinfo/makeinfo.c:5956 +msgid "@image missing filename argument" +msgstr "" + +#: makeinfo/makeinfo.c:6057 +#, c-format +msgid "%s requires letter or digit" +msgstr "" + +#: makeinfo/makeinfo.c:6142 +#, c-format +msgid "Unmatched `%c%s'" +msgstr "" + +#: makeinfo/makeinfo.c:6149 +#, c-format +msgid "`%c%s' needs something after it" +msgstr "" + +#: makeinfo/makeinfo.c:6155 +#, c-format +msgid "Bad argument to `%s', `%s', using `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:6328 +#, c-format +msgid "{No Value For \"%s\"}" +msgstr "" + +#: makeinfo/makeinfo.c:6378 +#, c-format +msgid "%c%s requires a name" +msgstr "" + +#: makeinfo/makeinfo.c:6486 +#, c-format +msgid "Reached eof before matching @end %s" +msgstr "" + +#: makeinfo/makeinfo.c:6715 +#, c-format +msgid "The `%c%s' command is meaningless within a `@%s' block" +msgstr "" + +#: makeinfo/makeinfo.c:6724 +#, c-format +msgid "%citemx is not meaningful inside of a `%s' block" +msgstr "" + +#: makeinfo/makeinfo.c:6837 +#, c-format +msgid "%c%s found outside of an insertion block" +msgstr "" + +#: makeinfo/makeinfo.c:6928 +#, c-format +msgid "Missing `}' in %cdef arg" +msgstr "" + +#: makeinfo/makeinfo.c:7137 makeinfo/makeinfo.c:7157 +msgid "Function" +msgstr "" + +#: makeinfo/makeinfo.c:7141 +msgid "Macro" +msgstr "" + +#: makeinfo/makeinfo.c:7145 +msgid "Special Form" +msgstr "" + +#: makeinfo/makeinfo.c:7149 makeinfo/makeinfo.c:7161 +msgid "Variable" +msgstr "" + +#: makeinfo/makeinfo.c:7153 +msgid "User Option" +msgstr "" + +#: makeinfo/makeinfo.c:7165 +msgid "Instance Variable" +msgstr "" + +#: makeinfo/makeinfo.c:7169 makeinfo/makeinfo.c:7173 +msgid "Method" +msgstr "" + +#: makeinfo/makeinfo.c:7330 +#, c-format +msgid "Must be in a `%s' insertion in order to use `%s'x" +msgstr "" + +#: makeinfo/makeinfo.c:7402 +#, c-format +msgid "%csp requires a positive numeric argument" +msgstr "" + +#: makeinfo/makeinfo.c:7645 +msgid "asis" +msgstr "" + +#: makeinfo/makeinfo.c:7647 +msgid "none" +msgstr "" + +#: makeinfo/makeinfo.c:7669 +#, c-format +msgid "Bad argument to %c%s" +msgstr "" + +#: makeinfo/makeinfo.c:7961 +#, c-format +msgid "Unknown index `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8026 +#, c-format +msgid "Index `%s' already exists" +msgstr "" + +#: makeinfo/makeinfo.c:8057 +#, c-format +msgid "Unknown index `%s' and/or `%s' in @synindex" +msgstr "" + +#: makeinfo/makeinfo.c:8246 +#, c-format +msgid "Unknown index `%s' in @printindex" +msgstr "" + +#: makeinfo/makeinfo.c:8261 +msgid "" +"* Menu:\n" +"\n" +msgstr "" + +#: makeinfo/makeinfo.c:8448 +#, c-format +msgid "`%c%s' needs an argument `{...}', not just `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8463 +#, c-format +msgid "No closing brace for footnote `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8502 +msgid "Footnote defined without parent node" +msgstr "" + +#: makeinfo/makeinfo.c:8534 +msgid "-Footnotes" +msgstr "" + +#: makeinfo/makeinfo.c:8589 +msgid "" +"---------- Footnotes ----------\n" +"\n" +msgstr "" + +#: makeinfo/makeinfo.c:8685 +#, c-format +msgid "macro `%s' previously defined" +msgstr "" + +#: makeinfo/makeinfo.c:8689 +#, c-format +msgid "here is the previous definition of `%s'" +msgstr "" + +#: makeinfo/makeinfo.c:8903 +#, c-format +msgid "Macro `%s' called with too many args" +msgstr "" + +#: makeinfo/makeinfo.c:9055 +#, c-format +msgid "%cend macro not found" +msgstr "" + +#: makeinfo/makeinfo.c:9095 +#, c-format +msgid "%cquote-arg only useful when the macro takes a single argument" +msgstr "" + +#: makeinfo/multi.c:206 +#, c-format +msgid "ignoring stray text `%s' after @multitable" +msgstr "" + +#: makeinfo/multi.c:277 +#, c-format +msgid "Too many columns in multitable item (max %d)" +msgstr "" + +#. impossible, I think. +#: makeinfo/multi.c:304 +msgid "multitable item not in active multitable" +msgstr "" + +#: makeinfo/multi.c:313 +#, c-format +msgid "Cannot select column #%d in multitable" +msgstr "" + +#: makeinfo/multi.c:404 +msgid "ignoring @tab outside of multitable" +msgstr "" + +#: makeinfo/multi.c:428 +msgid "** Multicolumn output from last row:\n" +msgstr "" + +#: makeinfo/multi.c:431 +#, c-format +msgid "* column #%d: output = %s\n" +msgstr "" + +#: util/install-info.c:119 util/install-info.c:132 +msgid "virtual memory exhausted" +msgstr "" + +#: util/install-info.c:188 +#, c-format +msgid "%s: warning: " +msgstr "" + +#: util/install-info.c:209 +#, c-format +msgid " for %s" +msgstr "" + +#: util/install-info.c:278 +#, c-format +msgid "\tTry `%s --help' for a complete list of options.\n" +msgstr "" + +#: util/install-info.c:286 +#, c-format +msgid "" +"%s [OPTION]... [INFO-FILE [DIR-FILE]]\n" +" Install INFO-FILE in the Info directory file DIR-FILE.\n" +"\n" +"Options:\n" +"--delete Delete existing entries in INFO-FILE;\n" +" don't insert any new entries.\n" +"--dir-file=NAME Specify file name of Info directory file.\n" +" This is equivalent to using the DIR-FILE argument.\n" +"--entry=TEXT Insert TEXT as an Info directory entry.\n" +" TEXT should have the form of an Info menu item line\n" +" plus zero or more extra lines starting with whitespace.\n" +" If you specify more than one entry, they are all added.\n" +" If you don't specify any entries, they are determined\n" +" from information in the Info file itself.\n" +"--help Display this help and exit.\n" +"--info-file=FILE Specify Info file to install in the directory.\n" +" This is equivalent to using the INFO-FILE argument.\n" +"--info-dir=DIR Same as --dir-file=DIR/dir.\n" +"--item=TEXT Same as --entry TEXT.\n" +" An Info directory entry is actually a menu item.\n" +"--quiet Suppress warnings.\n" +"--remove Same as --delete.\n" +"--section=SEC Put this file's entries in section SEC of the directory.\n" +" If you specify more than one section, all the entries\n" +" are added in each of the sections.\n" +" If you don't specify any sections, they are determined\n" +" from information in the Info file itself.\n" +"--version Display version information and exit.\n" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu.\n" +msgstr "" + +#: util/install-info.c:334 +msgid "" +"This is the file .../info/dir, which contains the\n" +"topmost node of the Info hierarchy, called (dir)Top.\n" +"The first time you invoke Info you start off looking at this node.\n" +"\n" +"File: dir Node: Top This is the top of the INFO tree\n" +"\n" +" This (the Directory node) gives a menu of major topics.\n" +" Typing \"q\" exits, \"?\" lists all Info commands, \"d\" returns here,\n" +" \"h\" gives a primer for first-timers,\n" +" \"mEmacs<Return>\" visits the Emacs manual, etc.\n" +"\n" +" In Emacs, you can click mouse button 2 on a menu item or cross reference\n" +" to select it.\n" +"\n" +"* Menu:\n" +msgstr "" + +#: util/install-info.c:357 +#, c-format +msgid "%s: could not read (%s) and could not create (%s)\n" +msgstr "" + +#: util/install-info.c:456 util/install-info.c:466 +#, c-format +msgid "%s: Specify the Info directory only once.\n" +msgstr "" + +#: util/install-info.c:494 +#, c-format +msgid "%s: Specify the Info file only once.\n" +msgstr "" + +#: util/install-info.c:521 +#, c-format +msgid "install-info (GNU %s) %s\n" +msgstr "" + +#: util/install-info.c:541 +#, c-format +msgid "excess command line argument `%s'" +msgstr "" + +#: util/install-info.c:545 +msgid "No input file specified; try --help for more information." +msgstr "" + +#: util/install-info.c:547 +msgid "No dir file specified; try --help for more information." +msgstr "" + +#: util/install-info.c:599 util/install-info.c:622 +msgid "START-INFO-DIR-ENTRY without matching END-INFO-DIR-ENTRY" +msgstr "" + +#: util/install-info.c:618 +msgid "END-INFO-DIR-ENTRY without matching START-INFO-DIR-ENTRY" +msgstr "" + +#. No need to abort here, the original info file may not have +#. the requisite Texinfo commands. This is not something an +#. installer should have to correct (it's a problem for the +#. maintainer), and there's no need to cause subsequent parts of +#. `make install' to fail. +#: util/install-info.c:632 +#, c-format +msgid "no info dir entry in `%s'" +msgstr "" + +#: util/install-info.c:843 +#, c-format +msgid "menu item `%s' already exists, for file `%s'" +msgstr "" + +#: util/install-info.c:866 +#, c-format +msgid "no entries found for `%s'; nothing deleted" +msgstr "" + +#: util/texindex.c:263 +msgid "keep temporary files around after processing" +msgstr "" + +#: util/texindex.c:265 +msgid "do not keep temporary files around after processing (default)" +msgstr "" + +#: util/texindex.c:267 +msgid "send output to FILE" +msgstr "" + +#: util/texindex.c:269 +msgid "display version information and exit" +msgstr "" + +#: util/texindex.c:271 +msgid "display this help and exit" +msgstr "" + +#: util/texindex.c:282 +#, c-format +msgid "Usage: %s [OPTION]... FILE...\n" +msgstr "" + +#: util/texindex.c:283 +msgid "Generate a sorted index for each TeX output FILE.\n" +msgstr "" + +#. Avoid trigraph nonsense. +#: util/texindex.c:285 +msgid "Usually FILE... is `foo.??' for a document `foo.texi'.\n" +msgstr "" + +#: util/texindex.c:286 +msgid "" +"\n" +"Options:\n" +msgstr "" + +#: util/texindex.c:300 +msgid "" +"\n" +"Email bug reports to bug-texinfo@prep.ai.mit.edu." +msgstr "" + +#: util/texindex.c:347 +#, c-format +msgid "texindex (GNU %s %s) 2.1\n" +msgstr "" + +#: util/texindex.c:926 util/texindex.c:960 util/texindex.c:1036 +#: util/texindex.c:1064 +#, c-format +msgid "%s: not a texinfo index file" +msgstr "" + +#: util/texindex.c:1021 +#, c-format +msgid "failure reopening %s" +msgstr "" + +#: util/texindex.c:1334 +#, c-format +msgid "entry %s follows an entry with a secondary name" +msgstr "" + +#: util/texindex.c:1672 +#, c-format +msgid "%s; for file `%s'.\n" +msgstr "" + +#: util/texindex.c:1733 +#, c-format +msgid "Virtual memory exhausted in %s ()! Needed %d bytes." +msgstr "" diff --git a/gnu/usr.bin/texinfo/stamp-h.in b/gnu/usr.bin/texinfo/stamp-h.in new file mode 100644 index 00000000000..9788f70238c --- /dev/null +++ b/gnu/usr.bin/texinfo/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/gnu/usr.bin/texinfo/util/Makefile.am b/gnu/usr.bin/texinfo/util/Makefile.am new file mode 100644 index 00000000000..4326f08c0d4 --- /dev/null +++ b/gnu/usr.bin/texinfo/util/Makefile.am @@ -0,0 +1,13 @@ +## Makefile.am for texinfo/util. +## $Id: Makefile.am,v 1.1 1997/08/01 22:01:03 kstailey Exp $ +## Run automake in .. to produce Makefile.in from this. + +bin_PROGRAMS = install-info texindex +bin_SCRIPTS = texi2dvi + +localedir = $(datadir)/locale +INCLUDES = -I$(top_srcdir)/lib -I../intl -DLOCALEDIR=\"$(localedir)\" +LDADD = ../lib/libtxi.a @INTLLIBS@ + +EXTRA_DIST = README deref.c fixfonts gen-dir-node tex3patch texi2dvi \ + update-info diff --git a/gnu/usr.bin/texinfo/util/README b/gnu/usr.bin/texinfo/util/README new file mode 100644 index 00000000000..b1ce44ca9af --- /dev/null +++ b/gnu/usr.bin/texinfo/util/README @@ -0,0 +1,3 @@ +Assorted Texinfo-related programs and scripts. +texindex, texi2dvi, and install-info get installed. +The other programs are for your amusement. diff --git a/gnu/usr.bin/texinfo/util/update-info b/gnu/usr.bin/texinfo/util/update-info new file mode 100644 index 00000000000..d946bceb511 --- /dev/null +++ b/gnu/usr.bin/texinfo/util/update-info @@ -0,0 +1,875 @@ +#!/bin/sh +# update-info -- update dir file from all extant info pages. +# +# 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, you can either send email to this +# program's maintainer or write to: The Free Software Foundation, +# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. +# +# Author: rhawes@dmapub.dma.org. Please report bugs to him. +# +# run this program to install update-info +# ###SECTION 0### install script +# These constants set the version numbers for both files: +PROGRAM_VERSION="1.4" +PACKAGE_VERSION="4.0" + +# ENVIRONMENT +if test -z "$TMPDIR"; then + TMPDIR="/usr/tmp" +fi + +TMP_SED="$TMPDIR/uss$$.info" +TMP_F_ADD_SECTION="$TMPDIR/ufa$$.info" +TMP_F_DELETE_INVALID="$TMPDIR/ufd$$.info" +TMP_F_INSERT_MISSING="$TMPDIR/ufi$$.info" +TMP_FILES="$TMP_SED $TMP_F_ADD_SECTION $TMP_F_DELETE_INVALID\ + $TMP_F_INSERT_MISSING" + +trap 'rm -f $TMP_FILES' 0 + +# file boundaries +UPDATE_INFO="/^# _file: 'update-info'_/" +UPDATE_INFO_F="/^# _file: 'update-info.f'_/" + +# @F_ADD_SECTION@ +echo 'Item_Num=`expr "$Item_Num" + "1"` +echo "$1">>"$TMP_SECTIONS" +if test "$Item_Status"; then + Item_Status=`echo "${Item_Status} +X"` +else + Item_Status="X" +fi '>$TMP_F_ADD_SECTION + +# @F_INSERT_MISSING@ +echo 'if test -z "$Create_Node"; then + rm -f ${Info_Node}.old + cp $Info_Node ${Info_Node}.old + echo "$BACKUP_MSG" +fi +echo "/$MENU_BEGIN/ ++,$ d +r $TMP_MENU +w +q"|ed -s $Info_Node>/dev/null'>$TMP_F_INSERT_MISSING + +# @F_DELETE_INVALID@ +echo ' +rm -f ${Info_Node}.old +cp $Info_Node ${Info_Node}.old +echo "$BACKUP_MSG" +echo "/$MENU_BEGIN/ ++,$ d +w +q"|ed -s $Info_Node>/dev/null +sed -f "$TMP_SED" "$TMP_MENU">>"$Info_Node"'>$TMP_F_DELETE_INVALID + +cat<<Sed_Script_EOF>$TMP_SED +s/@UPDATE_INFO_VERSION@/$PROGRAM_VERSION/g +s/@TEXINFO_VERSION@/$PACKAGE_VERSION/g +s/@SET_ITEM@/Item_Status=\`echo "\$Item_Status"|sed -e "\${1}s%^.*%\${2}%"\`/ +/@F_ADD_SECTION@/r $TMP_F_ADD_SECTION +/@F_ADD_SECTION@/d +/@F_DELETE_INVALID@/r $TMP_F_DELETE_INVALID +/@F_DELETE_INVALID@/d +/@F_INSERT_MISSING@/r $TMP_F_INSERT_MISSING +/@F_INSERT_MISSING@/d +Sed_Script_EOF + +sed -e "1,${UPDATE_INFO}d" -e "$UPDATE_INFO_F,\$d" -f $TMP_SED $0>update-info +sed -e "1,${UPDATE_INFO_F}d" -f $TMP_SED $0>update-info.f +chmod +x update-info update-info.f +echo "installed update-info, and update-info.f into `pwd`" +rm -f $TMP_FILES +exit + +# _file: 'update-info'_ +#!/bin/sh +#update-info (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ +#Copyright (C) 1997 Free Software Foundation, Inc. +#update-info comes with NO WARRANTY, to the extent permitted by law. +#You may redistribute copies of update-info +#under the terms of the GNU General Public License. +#For more information about these matters, see the files named COPYING." +#Author: Richard L. Hawes + +# ###SECTION 1### Constants +set -h 2>/dev/null +# ENVIRONMENT +if test -z "$TMPDIR"; then + TMPDIR="/usr/tmp" +fi +if test -z "$LINES"; then + LINES=24 +fi +if test -z "$COLUMNS"; then + COLUMNS=80 +fi +if test -z "$EDITOR"; then + EDITOR=vi +fi +if test -z "$LINENO"; then + LINENO="0" +fi +# constants redefined by update-info.f +PROMPT1="(y=yes, Y=yes to all, n=no, N=No to all):" +FUNCTIONS="" +# +ARGUMENTS="$*" +DISPLAY_NUM=`expr "$LINES" - 4` +CONTROL_D="{Ctrl-D}" +DIR_SECTION="^INFO-DIR-SECTION" +ENTRY_END="^END-INFO-DIR-ENTRY" +ENTRY_START="^START-INFO-DIR-ENTRY" +MENU_BEGIN='^\*\([ ]\)\{1,\}Menu:' +MENU_ITEM='^\* ([^ ]).*:([ ])+\(' +SECTION_TITLE="^[A-Za-z0-9]" +MENU_FILTER1='s/^\*\([ ]\)\{1,\}/* /' +MENU_FILTER2='s/\([ ]\)\{1,\}$//g' +TMP_ITEM="${TMPDIR}/ui${$}.info" +TMP_LIST="${TMPDIR}/ul${$}.info" +TMP_MENU="${TMPDIR}/um${$}.info" +TMP_SECTIONS="${TMPDIR}/us${$}.info" # used only in Detect_Missing +TMP_SED="$TMP_SECTIONS" # used only in Detect_Invalid routines +TMP_FILE1="${TMPDIR}/ux${$}.info" +TMP_FILE2="${TMPDIR}/uy${$}.info" +TMP_COUNT="$TMP_FILE2" +TMP_FILE_LIST="$TMP_LIST $TMP_MENU $TMP_SECTIONS $TMP_FILE1 $TMP_FILE2\ + $TMP_ITEM" +TRY_HELP_MSG="Try --help for more information" +if zcat --version 2>/dev/null>/dev/null; then + CAT_COMMAND="zcat -f" +else + echo "$0:$LINENO: GNU zcat not found">&2 + CAT_COMMAND="cat" +fi + +# ###SECTION 100### main program +#variables set by options +Create_Node="" +Debug=":" +Interactive="" +Load_Functions="y" +Mode="" +# +Inserts="0" +Inserts_Total="0" +Invalid="0" +Invalid_Total="0" +Changed="" + +while test "$*" + do + case "$1" in + -c) Create_Node="y";; + -ci|-ic) Create_Node="y"; Interactive="y";; + -cif|-cfi|-ifc|-icf|-fci|-fic) Create_Node="y" + Interactive="y"; Load_Functions="";; + --debug) set -eux; Debug="set>&2";; + -d|--delete) Mode="Detect_Invalid";; + -f) Load_Functions="";; + -i|--interactive) Interactive="y";; + -fi|-if) Load_Functions=""; Interactive="y";; + -id|-di) Mode="Detect_Invalid"; Interactive="y";; + +i|+d|+f);; + --version) +cat<<VersionEOF +update-info (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ +Copyright (C) 1997 Free Software Foundation, Inc. +update-info comes with NO WARRANTY, to the extent permitted by law. +You may redistribute copies of update-info +under the terms of the GNU General Public License. +For more information about these matters, see the files named COPYING. +Author: Richard L. Hawes +VersionEOF + exit;; + + --help) +cat<<HelpEndOfFile +Usage: update-info [OPTION]... INFO_PATH/INFO_DIR_FILE + +It detects and inserts missing menu items into the info node file. + +Options: +-c create a new info node + --debug print debug information to standard error path +-d, --delete delete invalid menu items (ignore missing menu items) +-f do not load functions (file update-info.f) + --help print this help message and exit +-i, --interactive interactive mode prompts before inserting or removing + menu items + --version print current version and exit +Backup of the info node has a '.old' suffix added. This is a shell script. +Files: update-info.f -- contains functions (optional). +Environment Variables: COLUMNS, EDITOR, LINES, TMPDIR +Email bug reports to bug-texinfo@prep.ai.mit.edu. +HelpEndOfFile + exit;; + + [-+]*) echo "$0:$LINENO: \"$1\" is not a valid option">&2 + echo "$TRY_HELP_MSG">&2 + exit 2;; + *) break;; + esac + shift + done + +if test "$#" -lt "1"; then + echo "$0:$LINENO: Too few parameters">&2 + echo "$TRY_HELP_MSG">&2 + exit 2 +elif test "$#" -gt "1"; then + echo "$0:$LINENO: Too many parameters">&2 + echo "$TRY_HELP_MSG">&2 + exit 2 +fi +Info_Path="$1" +Info_Node=`basename "$Info_Path"` +if echo "$Info_Node"|grep ".*dir$">/dev/null; then + : +else + echo "$0:$LINENO: $Info_Node is not a valid info node name">&2 + exit 2 +fi +Info_Pathname=`dirname "$Info_Path"` +cd "$Info_Pathname"||exit + +BACKUP_MSG="Backed up $Info_Node to ${Info_Node}.old." +HANGUP_MSG="Hang up on \"update-info $ARGUMENTS\"" +INSERT_MSG="menu item(s) were inserted (not counting duplicates)." +INSERT_MSG2="total menu item(s) were inserted into `pwd`/$Info_Node" +DELETE_MSG="invalid menu item(s) were removed (not counting duplicates)." +DELETE_MSG2="total invalid menu item(s) were removed from `pwd`/$Info_Node" + +if test "$Create_Node"; then + if test "$Mode"; then + echo "$0:$LINENO: ERROR: Illogical option combination: -d -c">&2 + echo "$TRY_HELP_MSG">&2 + exit 2 + fi + if test -f "$Info_Node"; then + rm -f ${Info_Node}.old + mv "$Info_Node" "${Info_Node}.old" + echo "$BACKUP_MSG" + fi + echo "Creating new Info Node: `pwd`/$Info_Node" +cat>$Info_Node<<NodeEndOfFile||exit + +This is the file .../info/dir, which contains the topmost node of the +Info hierarchy. The first time you invoke Info you start off +looking at that node, which is (dir)Top. + +File: dir Node: Top This is the top of the INFO tree + This (the Directory node) gives a menu of major topics. + Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" + gives a primer for first-timers, "mTexinfo<Return>" visits Texinfo topic, + etc. + Or click mouse button 2 on a menu item or cross reference to select it. + --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) --- + +* Menu: The list of major topics begins on the next line. + +NodeEndOfFile +else + if test ! -f "$Info_Node"; then + echo "$0:$LINENO: $Info_Node is irregular or nonexistant">&2 + exit 2 + elif test ! -r "$Info_Node"; then + echo "$0:$LINENO: $Info_Node is not readable">&2 + exit 2 + elif test ! -w "$Info_Node"; then + echo "$0:$LINENO: $Info_Node is not writeable">&2 + exit 2 + fi +fi + +if test "$Load_Functions" -a "$Interactive" -a -z "$Mode"; then + if FUNCTIONS_VERSION=`( update-info.f )`; then + if test `echo "$FUNCTIONS_VERSION"\ + |cut -d' ' -f5` = "@UPDATE_INFO_VERSION@"; then + echo "Loading functions..." + . update-info.f + else + echo "$0:$LINENO: wrong version of update-info.f">&2 + echo "(functions were not loaded)">&2 + fi + else + echo "(functions were not loaded)">&2 + fi +fi + + +trap ' eval "$Debug"; rm -f $TMP_FILE_LIST; exit ' 0 +if test "$Interactive"; then + if test ! -t "1"; then + echo "$0:$LINENO: Cannot run in interactive mode "\ + "standard out is redirected">&2 + exit 2 + fi + trap ' ' 2 3 +else + trap ' rm -f $TMP_FILE_LIST + echo "$0:$LINENO: received INT signal. All edits are canceled.">&2 + exit ' 2 + trap ' rm -f $TMP_FILE_LIST + echo "$0:$LINENO: received QUIT signal. All edits are canceled.">&2 + exit ' 3 +fi +if test -z "$Mode"; then + trap ' + if test "$Changed"; then + { + echo $HANGUP_MSG + @F_INSERT_MISSING@ + Inserts_Total=`wc -c<"$TMP_COUNT"` + echo $Inserts_Total $INSERT_MSG2 + }|mail "$LOGNAME" + fi + rm -f $TMP_FILE_LIST + exit ' 1 +else + trap ' + if test "$Changed"; then + { + echo $HANGUP_MSG + @F_DELETE_INVALID@ + Invalid_Total=`wc -l<"$TMP_SED"` + echo $Invalid_Total $DELETE_MSG2 + }|mail $LOGNAME + fi + rm -f $TMP_FILE_LIST + exit ' 1 +fi + +sed -e "1,/$MENU_BEGIN/d" -e "$MENU_FILTER1" -e "$MENU_FILTER2"<$Info_Node\ +|tee $TMP_MENU\ +|sed -n -e '/\* /{ +s/).*$//g +s/\.gz$// +s/\.info$// +s/^.*(//p +}'|sort -u>$TMP_FILE1 +ls -F|sed -e '/\/$/d' -e '/[-.][0-9]/d'\ + -e '/:$/d' -e '/^$/d' -e "/^${Info_Node}~\$/d"\ + -e "/^${Info_Node}\$/d" -e "/^${Info_Node}.old\$/d"\ + -e 's/\.gz$//' -e 's/\.info$//'|sort>$TMP_FILE2 + +if test -z "$Mode"; then + #Detect Missing + comm -13 $TMP_FILE1 $TMP_FILE2>$TMP_LIST + cat</dev/null>$TMP_COUNT + #get sections, initialize variables + sed -n -e "/$SECTION_TITLE/p" "$TMP_MENU">"$TMP_SECTIONS" + Item_Num=`wc -l<"$TMP_SECTIONS"|tr -d ' '` + Item_Status=`echo\ + |awk "BEGIN{for(i=1;i<=${Item_Num};i++)printf(\"_\n\")}"` + Item_Dir="$Item_Num" + for Info_Name in `cat $TMP_LIST` + do + if test -r "$Info_Name"; then + Info_File="$Info_Name" + elif test -r "${Info_Name}.info"; then + Info_File="${Info_Name}.info" + elif test -r "${Info_Name}.gz"; then + Info_File="${Info_Name}.gz" + elif test -r "${Info_Name}.info.gz"; then + Info_File="${Info_Name}.info.gz" + else + echo "$0:$LINENO: can't find info file for ${Info_Name}?">&2 + fi + #generate menu item + echo|tr -d '\012'>$TMP_FILE1 + eval $CAT_COMMAND "$Info_File"\ + |sed -n -e "/$DIR_SECTION/w $TMP_FILE1"\ + -e "/$ENTRY_START/,/$ENTRY_END/{ + $MENU_FILTER1 + p + }"|awk "BEGIN{Mode=0} + /^$/{if(Mode==1)exit} + /^([ ])+([^ ])+/{if(Mode==1)print} + /^[^ ]/{if(Mode==1)exit} + /${MENU_ITEM}${Info_Name}\)\./{if(Mode==0){Mode++ + print} + else + exit}">"$TMP_ITEM" + if test ! -s "$TMP_ITEM"; then + echo "* $Info_Name: ($Info_Name).">"$TMP_ITEM" + fi + Item_Status=`echo "$Item_Status"|sed -e '1,$s/^./_/'` + if test -s "$TMP_FILE1"; then + Item_Section=`sed -e "s/$DIR_SECTION[ ]*//"\ + <$TMP_FILE1` + else + Item_Section=`echo "Miscellaneous"` + fi + Size=`echo "$Item_Section"|wc -l|tr -d ' '` + # initialize variables, check for new sections + Num1=1 + while test "$Num1" -le "$Size" + do + Item=`echo "$Item_Section"|sed -n -e "${Num1}p"` + if Num=`grep -in "^$Item$" "$TMP_SECTIONS"`; then + Num=`echo "$Num"|sed -e 's/:.*$//g'` + ##F#Set_Item + set "$Num" "X" + @SET_ITEM@ + else + set "$Item" + @F_ADD_SECTION@ + fi + Num1=`expr "$Num1" + "1"` + done + if test "$Interactive"; then + echo "$Item_Section" + cat "$TMP_ITEM" + echo "add menu item for $Info_File? " + while true + do + echo "$PROMPT1"|tr -d '\012' + read Answer + case $Answer in + y) break;; + e) + if test "$FUNCTIONS"; then + Select_Sections + break + else + echo "Can't edit. "\ + "Functions are not loaded.">&2 + fi;; + Y) Interactive=""; break;; + n) continue 2;; + N) break 2;; + *) echo "\"$Answer\" "\ + "is an invalid response">&2;; + esac + done + fi + if echo "$Item_Status"|grep '^X'>/dev/null; then + # edit $TMP_MENU + + Changed="y" + ( + trap ' ' 1 2 3 + Tmp_Var=`echo "$Item_Status"|tr -d '\012'` + Key=`awk -F':' ' FNR==1{ print $1}' $TMP_ITEM` + # add new sections to 'dir' file + if test "$Item_Num" -gt "$Item_Dir"; then + if test "$Item_Dir" -ne "0"; then + sed -e "1,${Item_Dir}d" -e 'i\ + +' "$TMP_SECTIONS">>"$TMP_MENU" + else + sed -e 'i\ + +' "$TMP_SECTIONS">>"$TMP_MENU" + fi + fi + # awk determines the insertion points for each section + awk -F":" "function Insert(Line){ + if(Mode==2){ + Mode=1;if(substr(\"$Tmp_Var\",Item++,1)==\"X\") + print Line + } + } + BEGIN{Mode=1;Item=1} + /$SECTION_TITLE/{Insert(FNR-1);if(Mode>=1)Mode=2} + /${MENU_ITEM}.*\)\./{if(\$1>Item_Name)Insert(FNR-1)} + /^$/{Insert(FNR-1)} + END{Insert(FNR)}" Item_Name="$Key" "$TMP_MENU"\ + |sort -nr|sed -e "s%\$% r $TMP_ITEM%"|sed -e '$a\ +w +' -e '$a\ +q +'|ed -s "$TMP_MENU" + echo "$Item_Status"|tr -cd "X">>$TMP_COUNT + ) + + Inserts=`expr "$Inserts" + "1"` + echo "$Info_File installed into section(s):"\ + |tr -d '\012' + echo "$Item_Status"|awk '/X/{printf(" %d", FNR)}' + echo + Item_Dir="$Item_Num" + else + echo "$Info_File not installed (no section selected)" + fi + done + # print summary + trap ' ' 1 2 3 + if test "$Changed"; then + @F_INSERT_MISSING@ + Inserts_Total=`wc -c<"$TMP_COUNT"|tr -d " "` + if test "$Inserts" -ne "$Inserts_Total"; then + echo "$Inserts $INSERT_MSG" + fi + echo "$Inserts_Total $INSERT_MSG2" + fi +else + # Detect Invalid + cat</dev/null>"$TMP_SED" + comm -23 $TMP_FILE1 $TMP_FILE2>$TMP_LIST + for Info_Name in `cat $TMP_LIST` + do + if test "$Interactive"; then + # display invalid menu item(s) + awk "BEGIN{Mode=1} + /^([ ])+([^ ])+/{if(Mode==2)print} + /^$/{if(Mode==2)Mode=1} + /$SECTION_TITLE/{Section=\$0} + /^[^ ]/{if(Mode==2)Mode=1} + /${MENU_ITEM}${Info_Name}\)\./{if(Mode==1){Mode++ + print Section + print}}" $TMP_MENU + echo "delete menu item for $Info_Name? " + while true + do + echo\ + "(y=yes, n=no, Y=yes to all, N=No to all):"\ + |tr -d '\012' + read Answer + case "$Answer" in + y) break;; + Y) Interactive=""; break;; + n) continue 2;; + N) break 2;; + *) echo "\"$Answer\" "\ + "is an invalid reponse">&2;; + esac + done + fi + # remove menu item from $TMP_MENU + Invalid=`expr "$Invalid" + "1"` + Changed="y" + ( + trap ' ' 1 2 3 + echo\ + "invalid menu item for $Info_Name removed from section(s):"\ + |tr -d '\012' + awk "function Delete(Last){ + printf(\"%d,%dd\n\",First,Last-1)>>\"$TMP_SED\"} + BEGIN{Mode=1;Section=0} + /^$/{if(Mode==2){Delete(FNR);Mode=1}} + /$SECTION_TITLE/{Section++} + /^[^ ]/{if(Mode==2){Delete(FNR);Mode=1}} + /${MENU_ITEM}${Info_Name}\)\./{if(Mode==1){ + First=FNR;printf(\" %d\",Section);Mode=2}} + END{if(Mode==2)Delete(FNR+1)}" $TMP_MENU + echo + ) + done + + # display a summary + trap ' ' 1 2 3 + if test "$Changed"; then + Invalid_Total=`wc -l<"$TMP_SED"|tr -d ' '` + @F_DELETE_INVALID@ + if test "$Invalid" -ne "$Invalid_Total"; then + echo "$Invalid $DELETE_MSG" + fi + echo "$Invalid_Total $DELETE_MSG2" + fi +fi +if test -z "$Changed"; then + echo "Nothing to do" +fi +rm -f $TMP_FILE_LIST +eval "$Debug" +exit 0 +# _file: 'update-info.f'_ +#update-info.f (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ +#Copyright (C) 1997 Free Software Foundation, Inc. +#update-info comes with NO WARRANTY, to the extent permitted by law. +#You may redistribute copies of update-info +#under the terms of the GNU General Public License. +#For more information about these matters, see the files named COPYING." +#Author: Richard L. Hawes + +# update-info.f functions for update-info + +# ###SECTION 1### functions used to insert missing menu items + +Set_Item (){ +# set item status +@SET_ITEM@ +} + +Add_Section (){ +# add a section +@F_ADD_SECTION@ +} + +# ###SECTION 2### functions for menu selection of sections + +Print (){ +# print a line without a linefeed +echo "$*"|tr -d '\012' +} + +Get_Answer (){ +# get an answer to question +_gs_Valid="$1" +_gs_Prompt="$2" +set -f +Answer="" +while test -z "$Answer" + do + Print "$_gs_Prompt" + if read Answer; then + : + else + Answer="$CONTROL_D" + echo + fi + if expr "$Answer" : "[$_gs_Valid]$">/dev/null; then + : + else + Print "\"$Answer\" is not a valid response! --">&2 + Answer="" + fi + done +set +f +} + +Do_Previous (){ +# go to previous screen +if test "$Previous"; then + Next="$Top_Item" + Top_Item="$Previous" + if Previous=`expr "$Top_Item" - "$DISPLAY_NUM"`; then + if test "$Previous" -le "0"; then + Previous="" + fi + else + Previous="" + fi +elif test "$Next"; then + Last_Page +else + Print "There is no previous page. ">&2 +fi +} + +Do_Next (){ +# process go to next +if test "$Next"; then + Previous="$Top_Item" + Top_Item="$Next" + Set_Next +elif test "$Previous"; then + Top_Item="1" + Previous="" + Set_Next +else + Print "There is no next page. ">&2 +fi +} + +Do_Add_Section (){ +# process add section command +echo +echo "Please enter the name of the new section:" +if read Answer; then + Answer=`echo "$Answer"\ + |sed -e 's/^\([ ]\)\{1,\}//g' -e "$MENU_FILTER2"` + if test "$Answer"; then + Add_Section "$Answer" + Last_Page + clear + fi +else + Answer="" +fi +if test -z "$Answer"; then + clear + Print "no section added. " +fi +} + +Do_Edit (){ +# process edit item command +if test -t "2"; then + _de_Done="" + cp "$TMP_ITEM" "$TMP_FILE1" + while test -z "$_de_Done" + do + eval $EDITOR "$TMP_FILE1" + clear + _de_Done="t" + if sed -n -e "$MENU_FILTER1" -e '1p' "$TMP_FILE1"\ + |egrep "${MENU_ITEM}${Info_Name}\)\.">/dev/null; then + : + else + sed -n -e '1p' "$TMP_FILE1" + echo "Pattern mismatch: `echo\ + "/${MENU_ITEM}${Info_Name}\)\./"\ + |tr -d "\011"`">&2 + echo + _de_Done="" + fi + if sed -n -e '2,$p' "$TMP_FILE1"|grep '^[^ ]'>&2; then + echo "These lines must have leading spaces">&2 + echo + _de_Done="" + fi + if test -z "$_de_Done"; then + Get_Answer "yn" "Invalid entry, cancel edits? (y or n):" + if test "y" = "$Answer"; then + clear + Print "Canceling edits -- invalid entry ">&2 + _de_Done="t" + fi + else + sed -e "$MENU_FILTER1" -e "$MENU_FILTER2" -e '/^$/d'\ + <"$TMP_FILE1">"$TMP_ITEM" + fi + done +else + Print "editor cannot run with error path redirected " +fi +} + +Do_Number (){ +# process number +_dn_Num="$1" +if test "$_dn_Num" -ge 1 -a "$_dn_Num" -le "$Item_Num"; then + if test `echo "$Item_Status"|sed -n -e "${_dn_Num}p"` = "_"; then + Set_Item "$_dn_Num" "X" + else + Set_Item "$_dn_Num" "_" + fi +else + Print "\"$_dn_Num\" is an invalid section number. ">&2 +fi +} + +Do_Help (){ +# process menu help +echo +echo "\ +Enter the following commands seperated +by spaces and terminated by<ENTER>: +# : (section number) toggle section +a : add a new section +e : edit item -- changes will not be + accepted if you change the + '(info_file_name).' or delete + the key parts: '*' 'Menu Name' ':' +h : get this help screen +n : next page +p : previous page +q : quit and do not put into menu +s : save and put into menu" +Print "Press enter to continue:" +read junk +clear +} + +Set_Next (){ +# determine value of Next +Next=`expr "$DISPLAY_NUM" + "$Top_Item"` +if test "$Next" -gt "$Item_Num"; then + Next="" +fi +} + +Last_Page (){ +# go to last page of menu +Top_Item=`echo|awk "BEGIN{printf(\"%d\", +int((${Item_Num}-1)/${DISPLAY_NUM})*${DISPLAY_NUM}+1)}"` +if test "$Top_Item" -gt "$DISPLAY_NUM"; then + Previous=`expr "$Top_Item" '-' "$DISPLAY_NUM"` +else + Previous="" +fi +Set_Next +} + +Select_Sections (){ +# prompt user for which sections +set -f +Top_Item="1" +Previous="" +Set_Next +clear +echo "Default sections are selected." +Done="" +while test -z "$Done" + do + awk "FNR==1{printf(\"%s\n\", substr(\$0,1,${COLUMNS}))}" $TMP_ITEM + Tmp_Var=`echo "$Item_Status"|tr -d '\012'` + awk "BEGIN{Max=$Top_Item+$DISPLAY_NUM} + FNR>=$Top_Item{if(FNR>=Max)exit + printf(\"%2d:%s %s\n\",FNR,substr(\"$Tmp_Var\",FNR,1), + substr(\$0,1,${COLUMNS}-5))}" "$TMP_SECTIONS" + echo "Enter 1-${Item_Num}, add, edit, help," + if test "$Previous" -o "$Next"; then + Print "next, previous, " + fi + Print "quit, save :" + read Command_List||Command_List="$CONTROL_D" + Command_List=`echo "$Command_List"\ + |tr '\011' ' '|tr ' ' '\012'|sed -e "/^$/d"` + clear + if test -z "$Command_List"; then + Help="y" + else + Help="" + fi + while test "$Command_List" + do + Command=`echo "$Command_List"|sed -n -e '1p'` + Command_List=`echo "$Command_List"|sed -e '1d'` + case "$Command" in + [0-9]|[0-9][0-9]) Do_Number "$Command";; + n*) Do_Next;; + p*) Do_Previous;; + a*) Do_Add_Section;; + e*) Do_Edit; break;; + h*) Help="y";; + s*) Done="s"; break;; + q*) Done="q" + Item_Status=`echo "$Item_Status"|sed -e '1,$s/^./_/'` + break;; + *) Print "$Command is not a valid command. ">&2 + Help="y";; + esac + done + if test "$Help"; then + Do_Help + fi + echo + done +set +f +# if new sections added, remove unused ones +if test "$Item_Num" -gt "$Item_Dir"; then + Tmp_Var=`echo "$Item_Status"|awk "FNR>$Item_Dir{ + if(\\$0==\"_\")printf(\"%d\n\", FNR)}"` + if test "$Tmp_Var"; then + Tmp_Var1=`echo "$Tmp_Var"|sed -e 's/$/d/'` + sed -e "$Tmp_Var1" "$TMP_SECTIONS">$TMP_FILE1 + cp $TMP_FILE1 "$TMP_SECTIONS" + Item_Status=`echo "$Item_Status"|sed -e "$Tmp_Var1"` + Tmp_Var="" + Tmp_Var1="" + Item_Num=`wc -l<"$TMP_SECTIONS"|tr -d ' '` + fi +fi +} + +# ###SECTION 100### Constants that redefine +PROMPT1="(y=yes, e=edit, Y=yes to all, n=no, N=No to all):" +FUNCTIONS="y" +# +echo "update-info.f (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@" |